CheckedListBox - Поиск элемента по тексту

У меня есть CheckedListBox, связанный с DataTable. Теперь мне нужно программно проверить некоторые элементы, но я обнаружил, что метод SetItemChecked(...) принимает только индекс элемента.

Есть ли практичный способ получить элемент по тексту/метке, не зная индекса элемента?

(ПРИМЕЧАНИЕ: у меня ограниченный опыт работы с WinForms...)


person davioooh    schedule 02.02.2012    source источник


Ответы (2)


Вы можете реализовать свои собственные SetItemChecked(string item);

    private void SetItemChecked(string item)
    {
        int index = GetItemIndex(item);

        if (index < 0) return;

        myCheckedListBox.SetItemChecked(index, true);
    }

    private int GetItemIndex(string item)
    {
        int index = 0;

        foreach (object o in myCheckedListBox.Items)
        {
            if (item == o.ToString())
            {
                return index;
            }

            index++;
        }

        return -1;
    }

CheckListBox использует object.ToString() для отображения элементов в списке. Вы можете реализовать метод, который выполняет поиск по всем объектам.ToString(), чтобы получить индекс элемента. Когда у вас есть индекс элемента, вы можете вызвать SetItemChecked(int, bool);

Надеюсь, поможет.

person Daniel Peñalba    schedule 02.02.2012
comment
Возможно, это зависит от привязки к DataTable, но o.ToString() в моем случае возвращает "System.Data.DataRowView", поэтому я думаю, что мне нужно использовать myCheckedListBox.GetItemText(o)... - person davioooh; 02.02.2012
comment
Когда я увидел практический способ, я имел в виду существующий метод для этого... Но похоже, что что-то подобное предоставляется фреймворком, поэтому я реализую свой собственный метод, как вы предлагаете. Большое Вам спасибо. - person davioooh; 02.02.2012
comment
Большое спасибо за этот метод - большинство вещей, которые я видел, были довольно грязными или слишком тривиальными. Для моей цели я загружал XML и заполнял проверенные элементы на основе настроек с использованием пользовательских объектов. - person confusedandamused; 19.10.2018

Вы можете попробовать просмотреть свой Datatable. Вы можете выполнить foreach для свойства DataTabke.Rows или использовать синтаксис SQL, как показано ниже:

DataTable dtTable = ...
DataRow[] drMatchingItems = dtTable.Select("label = 'plop' OR label like '%ploup%'"); // I assumed there is a "label" column in your table
int itemPos = drMatchingItems[0][id]; // take first item, TODO: do some checking of the length/matching rows

Ваше здоровье,

person John    schedule 02.02.2012