在选中列表框中获取具有值的索引

Posted

技术标签:

【中文标题】在选中列表框中获取具有值的索引【英文标题】:Get index with value in Checked List Box 【发布时间】:2010-11-09 20:09:14 【问题描述】:

当我单步执行代码时,我实际上发现chkContactType.Items 是空的。我什至在chkContactType.Items.Count 中添加了一个Watch,它只是0。我现在非常困惑,因为它显然不是因为我的Insert 方法工作正常,它使用这些相同的框并为每个项目插入值成员...... .


我有一些选中的列表框控件,我需要根据项目值设置 CheckState,因为这是存储在数据库中的现有记录。不幸的是,我只看到了一种通过未存储的索引来设置它的方法。该索引是控件的本地索引,因此,例如,ContactType 控件中有 15 个项目。索引为 0-14。项目值分别为 39,40,41,42,43,44,45,46,47,48,49,50,2077,2078,2079。如何使用值成员值获取索引值或使用值成员值设置每个返回项的检查状态?

谢谢

 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 的方式。我知道那里有一个“幻数”。我正在做。它与ContactType的DB中的CategoryID有关。

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

然后是 CurrentCaseNote BLL(kinda)-->

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);
        
    

【问题讨论】:

如何填充checkedlistbox控件? 【参考方案1】:

这似乎有效:

int index = checkedListBox1.Items.IndexOf("42");
checkedListBox1.SetItemChecked(index, true);

【讨论】:

我也是这么想的。我想知道我的问题是否在其他地方,因为当我通过代码时,它看起来好像 checkListBox.Items 是空的...... 您是否已将其绑定到绑定数据源?这可能不会填充 Items 属性。您可能必须通过绑定数据源的接口才能找到所需的索引。【参考方案2】:
                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

【讨论】:

【参考方案3】:

我也遇到了同样的问题。

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);    

【讨论】:

以上是关于在选中列表框中获取具有值的索引的主要内容,如果未能解决你的问题,请参考以下文章

基于具有列表值的多列删除数据框中的重复行[重复]

将列表中具有零值的多个列添加到 Pandas 数据框中

在c#MVC4中获取列表框中所选值的总和

如何更改 Ext js 组合框中某些值的索引

如何获得MFC列表框中选中的数据

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列