.NET невидимые предметы в выпадающем - PullRequest
0 голосов
/ 01 апреля 2010

Я загружаю строки в комбинированный список -

cboIndexLanguage.Items.Add("ThisLanguage")

Я бы хотел сделать некоторые из этих предметов невидимыми.

Ответы [ 5 ]

2 голосов
/ 12 декабря 2012

Я нашел решение. Это можно сделать, связав объект DataTable:

            comboBox.DisplayMember = "VALUE";
            comboBox.ValueMember = "ID";

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("VALUE");

            for (int i = 0; i < 5; i++)
            {
                DataRow row = dt.NewRow();
                row[0] = i;
                row[1] = "val"+i;
                dt.Rows.Add(row);
            }
            dt.AcceptChanges();

            comboBox.DataSource = dt;

Затем просто нашли предмет, который хотите скрыть, и спрячьте его (установив как удаленный):

dt.Select("ID = 2").First().Delete();

Или показать все:

dt.RejectChanges();
0 голосов
/ 02 апреля 2010

добавьте их в свой список

class MyCboItem
{
    public bool Visible { get; set; }
    public string Value { get; set; }
    public override string ToString()
    {
        if (Visible) return Value;
        return string.Empty;
    }
}
0 голосов
/ 01 апреля 2010

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

List<string> colorList = new List<string>();
colorList.Add ("Red");
colorList.Add ("Green");
colorList.Add ("Yellow");
colorList.Add ("Purple");
colorList.Add ("Orange");
...
colorList.Remove("Red");
colorList.Insert(2, "White");
colorList[colorList.IndexOf("Yellow")] = "Black";
colorList.Clear();


...

combobox.Items.Clear();
0 голосов
/ 01 апреля 2010

Поточно-ориентированным способом вы можете сделать это довольно просто (если вы хотите играть только с цветами):

private delegate void SetBackColorDelegate(int index, Color color);
private void SetBackColor(int index, Color color)
    {
        if (cboIndexLanguage.InvokeRequired)
        {
            cboIndexLanguage.Invoke(new SetBackColorDelegate(SetBackColor), new object[] { index, color });
        }
        else
        {
            cboIndexLanguage.Items[index].BackColor = color;
        }
    }

Другими словами, вы можете просто удалить элементы из поля со списком, но сохранить их в некоторой структуре данных f.ex:

class ComboElement
{
     public String ComboElementText { get; set; }
     public int Index { get; set; }

    public ComboElement(String elementText, int index)
    {
       ComboElementText = elementText;
       Index = index;
    }
}

//* List of hidden elements.
List<ComboElement> hiddenElements = new List<ComboElement>();

затем вы захотите показать его снова, вы можете взять его отсюда и вставить в нужное место (вы знаете индекс).

0 голосов
/ 01 апреля 2010

Попробуйте отправить сообщение CB_SETMINVISIBLE для каждого элемента.

OR

просто не устанавливайте текстовое значение!

Позднее редактировать:

int invItems = 5;
Message msg = new Message();
msg.Msg = CB_SETMINVISIBLE;
msg.LParam = 0;
msg.WParam = invItems;
msg.HWnd = combo.Handle;
MessageWindow.SendMessage(ref msg);

ИЛИ вызвать это:

[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, long wParam, long lParam);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...