Получить индекс со значением в поле Checked List - PullRequest
3 голосов
/ 10 июля 2009

Я нахожу, что chkContactType.Items пусто, когда я перешагиваю код. Я даже добавил Watch к chkContactType.Items.Count, и это никогда не что иное, как 0. Я сейчас сильно запутался, поскольку это, очевидно, не так, как мой метод Insert отлично работает, который использует те же самые блоки и вставляет Value Value для каждого элемента ... .


У меня есть некоторые проверенные элементы управления списком, которые мне нужно установить CheckState на основе значения элемента, поскольку именно это хранится в БД для ожидающей записи. К сожалению, я вижу только способ установить это по индексу, который не сохраняется. Индекс является локальным для элемента управления, поэтому, например, элемент управления ContactType содержит 15 элементов. Индекс 0-14. Стоимость предмета составляет 39,40,41,42,43,44,45,46,47,48,49,50,2077,2078,2079 соответственно. Как я могу получить значение индекса со значением Value Member ИЛИ установить контрольное состояние каждого возвращаемого элемента со значением Value Member?

Спасибо

 private void PaintDetails(Guid cNoteID)
    {
        var cNoteDetailDT = CurrentCaseNote.GetCNoteDetail(cNoteID);
        LoadCaseNoteDetailData(cNoteDetailDT.Rows[0]);

        // Load Contact Type Data for this CaseNote
        // contactTypeDT returns ItemID of chk items 
        // that were checked for this Guid
        using (var contactTypeDT = CurrentCaseNote.GetCNoteContactType(cNoteID))
        {
            if (contactTypeDT.Rows.Count > 0)
                foreach (DataRow row in contactTypeDT.Rows)
                {
                    LoadContactTypeData(row);
                }
        }
    }

    private void LoadContactTypeData(DataRow row)
    {
        // This does not work
        var theItem = row["ItemID"].ToString();
        // itemIndex always ends up set to -1
        var itemIndex = chkContactType.Items.IndexOf(theItem);
        chkContactType.SetItemChecked((int) itemIndex, true);

        // This works I just need to supply the correct index
        chkContactType.SetItemChecked(0,true);
    }

РЕДАКТИРОВАТЬ в ответ на комментарий

Вот так я заполняю Checked ListBox. Я знаю, что там есть «магическое число». Я работаю над этим. Это относится к CategoryID в БД ContactType.

 // Contact Type Check List Box
        chkContactType.DataSource = CurrentCaseNote.GetMaintItems(1);
        chkContactType.DisplayMember = "ItemDescription";
        chkContactType.ValueMember = "ItemID";

, а затем CurrentCaseNote BLL (своего рода) ->

public static DataTable GetMaintItems(int iCat)
    {
        IQueryable<tblCaseNotesMaintItem> tItems = CaseNoteDAL.GetCNTable();
        return (tItems.Where(item => item.CategoryID == iCat & item.IsActive).OrderBy(
                               item => item.OrderID).Select(item => new {item.ItemID, item.ItemDescription})).CopyLinqToDataTable();
    }

и, наконец, DAL ->

        public static Table<tblCaseNotesMaintItem> GetCNTable()
    {
        return dcCaseNotes.GetTable<tblCaseNotesMaintItem>();
    }

РЕДАКТИРОВАТЬ 2

Вот так выглядит мой код СЕЙЧАС, но все равно нет. Это как ItemCount никогда не заполняется ....

            // Load Contact Type Data for this CaseNote
        using (var contactTypeDT = CurrentCaseNote.GetCNoteContactType(cNoteID))
        {
            if (contactTypeDT.Rows.Count > 0)
                foreach (DataRow row in contactTypeDT.Rows)
                {
                    LoadContactTypeData(row);
                }
        }
    }

    private void LoadContactTypeData(DataRow row)
    {
        // This does not work
        var theItem = row["ItemID"];

        for (int i = 0; i < chkContactType.ItemCount; i++)
        {
            if(theItem == chkContactType.GetItemValue(i))
                chkContactType.SetItemChecked(i,true);
        }
    }

Ответы [ 3 ]

11 голосов
/ 11 июля 2009

Это похоже на работу:

int index = checkedListBox1.Items.IndexOf("42");
checkedListBox1.SetItemChecked(index, true);
1 голос
/ 23 февраля 2010
                For j As Integer = 0 To chklst_distributorlist.Items.Count - 1

                    If chklst_distributorlist.GetItemText(chklst_distributorlist.Items.Item(j)) = ds1.Tables(0).Rows(0)("suppliername").ToString Then

                        chklst_distributorlist.SetSelected(j, True)
                        chklst_distributorlist.SetItemCheckState(j, CheckState.Checked)
                    End If
                Next
0 голосов
/ 10 августа 2015

Я тоже сталкивался с такой же проблемой.

Индекс checkedListBox1.Items.IndexOf("value"); всегда равен -1.

Мне удалось получить индекс, используя следующий код.

for (int i = 0; i < checkedListBox1.Items.Count; i++)   
{    
   if (((System.Data.DataRowView)(checkedListBox1.Items[i])).Row.ItemArray[0].ToString() == "Value")    

   checkedListBox1.SetItemCheckState(i, CheckState.Checked);    
}
...