vasanthkumarmk Ответов: 2

Как динамически изменить порядок элементов combobox


У меня есть Combobox, который отображает "a", "b", "c", "d".
Тот же самый Combobox мне нужно изменить порядок отображения, например "c", "a", "d", "b".

Заранее спасибо.

У меня есть подробное объяснение ниже моего кода :-

Мне нужно отображать цвета в моем ComboBox, но не все цвета dotnet, я должен отображать только мои необходимые цвета. Код ниже

private void FillComboBoxBorderColor(MoeValueMCInfo mcInfo)
{
comboBox_BorderColor.Items.Clear();
float mcVersion = 0;
if (float.TryParse(mcInfo.Version.StringValue, out mcVersion))
{
if (mcInfo.Level.ToString() == "Enterprise" && mcVersion >= 4.0)
{
Dictionary<string, string> deviceSupportedColors = new Dictionary<string, string>();
deviceSupportedColors.Add("0", "OrangeRed");
deviceSupportedColors.Add("1", "Orange");
deviceSupportedColors.Add("2", "Yellow");

//List<string> deviceSupportedColors = new List<string> { "OrangeRed", "Orange", "Yellow", "LawnGreen", "MediumSpringGreen", "Aqua", "CadetBlue", "SlateBlue", "Violet", "Magenta", "MediumVioletRed", "Gray"};
ArrayList ColorList = new ArrayList();
Type colorType = typeof(System.Drawing.Color);
PropertyInfo[] propInfoList = colorType.GetProperties(BindingFlags.Static |
BindingFlags.DeclaredOnly | BindingFlags.Public);
foreach (PropertyInfo c in propInfoList)
{
if (deviceSupportedColors.ContainsValue(c.Name))
{
/*int indextoInsert = Convert.ToInt32((from d in deviceSupportedColors
where d.Value == c.Name
select d.Key).FirstOrDefault()); */

//comboBox_BorderColor.Items.Insert(indextoInsert, c.Name);
this.comboBox_BorderColor.Items.Add(c.Name); 
}
}
}
}
}


Так что в этом случае мне нужно отобразить порядок ComboBox
OrangeRed", "Orange", "Yellow", "LawnGreen", "MediumSpringGreen", "Aqua", "CadetBlue", "SlateBlue", "Violet", "Magenta", "MediumVioletRed", "Gray" 


Я попытался использовать индекс, но не смог этого добиться. (Мой код, упомянутый в командной строке)

Что я уже пробовал:

Я использовал индекс, но этого не смог добиться.

Maciej Los

Пожалуйста, предоставьте свой код. Используйте виджет" улучшить вопрос".

vasanthkumarmk

Мне нужно отобразить в порядке "оранжевого", "оранжевого", "желтого" (упомянутого в строке комментария списка).

2 Ответов

Рейтинг:
6

Alan N

То, что вы делаете, кажется слишком сложным. Если словарь, содержащий необходимый порядок, на самом деле жестко закодирован, то все, что требуется, - это список цветов в правильном порядке. Например:

Color[] deviceColors = new Color[] { Color.OrangeRed, Color.Orange, Color.Yellow };
comboBox_BorderColor.DisplayMember = "Name";
comboBox_BorderColor.DataSource = deviceColors;

Алан.


Michael_Davies

Вполне согласен, но если он хочет сделать это именно так...

vasanthkumarmk

Спасибо Alan N & amp; Michael_Davies оба ответа очень помогают.....

Рейтинг:
12

Michael_Davies

Если это не естественный порядок сортировки, то лучший способ-отсортировать элементы в combobox в списке или массиве в нужном порядке, а затем очистить combobox и вернуть новый отсортированный список обратно, убедившись, что .sorted=false на элементе управления.

Было бы проще сделать предложение, если бы я знал, как вы определяете порядок сортировки, что делает c первым в Вашем новом отсортированном списке?

private void Form1_Load(object sender, EventArgs e)
        {
            Dictionary<string, string> deviceSupportedColors = new Dictionary<string, string>();
            Dictionary<string, string> deviceSortedColors = new Dictionary<string, string>();

            deviceSupportedColors.Add( "OrangeRed", "0");
            deviceSupportedColors.Add( "Orange", "1");
            deviceSupportedColors.Add( "Yellow", "2");

                    //List<string> deviceSupportedColors = new List<string> { "OrangeRed", "Orange", "Yellow", "LawnGreen", "MediumSpringGreen", "Aqua", "CadetBlue", "SlateBlue", "Violet", "Magenta", "MediumVioletRed", "Gray"};
                    ArrayList ColorList = new ArrayList();
                    Type colorType = typeof(System.Drawing.Color);
                    PropertyInfo[] propInfoList = colorType.GetProperties(BindingFlags.Static |
                    BindingFlags.DeclaredOnly | BindingFlags.Public);
                    foreach (PropertyInfo c in propInfoList)
                    {
                        if (deviceSupportedColors.ContainsKey(c.Name))
                        {
                        string keyvalue = " ";

                            deviceSupportedColors.TryGetValue(c.Name, out keyvalue);

                            deviceSortedColors.Add(keyvalue, c.Name);
                        }
                    }
            var list = deviceSortedColors.Keys.ToList();
            list.Sort();

            // Loop through keys.
            foreach (var key in list)
            {
                comboBox1.Items.Add(deviceSortedColors[key]);
        }
        }


vasanthkumarmk

В моем случае я никогда не очищаю свой ComboBox, нужно держать одни и те же элементы в ComboBox и нужно менять положение элементов.

Michael_Davies

Совершенно ясный,

Combobox не предоставляет метода, позволяющего перемещать элементы, список либо сортируется, если .sorted=true, либо элементы появляются в том порядке, в котором вы их загружаете.

Таким образом, вы должны скопировать список в другое место, очистить combobox, отсортировать список по своему усмотрению, а затем поместить их обратно в combobox.

vasanthkumarmk

Я улучшил свой вопрос, не могли бы вы перепроверить и дать мне знать ответ? Это более полезно

Michael_Davies

Решение все еще остается в силе, как только вы выбрали нужные цвета, вам нужно отсортировать их, так как нужный вам порядок не является естественным, в вашем списке оранжевый цвет стоит перед оранжевым в propertyinfo, так как это естественный порядок сортировки, чтобы получить нужный вам порядок в combobox, вам придется отсортировать их, теперь ваш код яснее, я предлагаю вам создать второй словарь и добавить элемент из первого словаря, если он найден в propertyinfo, а затем повторить новый словарь в ключевом порядке, чтобы получить нужную вам сортировку.

vasanthkumarmk

Не могли бы вы, пожалуйста, дать небольшой код привязки для вашего рекомендуемого.

Michael_Davies

Добавил пример к ответу, используя свой код в качестве базы, протестировал его на простой форме с combobox под названием comboBox1, переименовал его в свое имя поля.

В основном переключите свой ключ и значения вокруг первого словаря, как вы хотите, чтобы порядок сортировки для цвета, затем добавьте имя цвета и ключ в новый словарь, экспортируйте ключи в список и сортируйте, чтобы получить нужный порядок, а затем заполните combobox в этом порядке.

Michael_Davies

Быстрое предостережение: если вы используете строку для ключа и имеете более 9 цветов, у вас будет проблема сортировки; "1" и "10" с сортировкой вместе.

vasanthkumarmk

Извините, что больше общаюсь с вами. Ваш код работает идеально, если out keyvalue не равен null, но я получаю null для keyvalue

Michael_Davies

Так что проверяйте на нуль и игнорируйте его.

vasanthkumarmk

Большое спасибо!!!!! Это действительно помогло и решило мою проблему. Еще раз спасибо!!! Но последний вопрос....
Что такое использование Line - & gt; deviceSupportedColors.TryGetValue(ок. Имя, из значения);

Michael_Davies

В .Net Framework a Try & lt;something & gt; пытается выполнить требуемую задачу, если она терпит неудачу, ответ обычно равен Null, он не вызывает исключения.

Посмотрите на Parse и TryParse, которые используются для преобразования переменных, Parse выдаст исключение, если входные данные неконвертируемы, TryParse вернет True, если это удалось, и целевая переменная будет содержать преобразованное значение, она вернет False, если нет, и целевая переменная будет равна Null.

Например;

int sdest = Int. Parse("123"); / / это будет успешно

sdest = Int. Parse ("ABC") / / это приведет к сбою и вызовет исключение, которое должно быть обработано

Самый простой способ-это;

инт идест;

if (Int. Tryparse ("ABC", out idest) = = true)
{//Строка преобразована...все хорошо idest имеет значение}
еще
{ // ошибка преобразования...идти дальше идест имеет значение null}

vasanthkumarmk

Большое спасибо за объяснение.....