在CheckedListBox中过滤数据后控制ItemChecked事件

时间:2017-01-26 11:19:53

标签: c# winforms

我有一个自定义的UserControl,它有一个TextBox,一个Button和一个CheckedListBox CheckedListBox的DataSource是一个DataTable - m_CheckBoxItems TextBox上有一个TextChanged事件 输入TextBox的每个字母都会导致DataSource根据找到的值进行更改。

DataRow[] filteredRows;
            if (string.IsNullOrEmpty(filter))
            {
                DataTable tmp = m_ChecBoxItems.Copy();
                ((ListBox)checkedListBox).DataSource = new BindingSource(tmp, null);
            }
            else
            {
                filteredRows = m_ChecBoxItems.Select("Text like '" + filter + "%'");
                DataTable tmp = filteredRows.CopyToDataTable();
                ((ListBox)checkedListBox).DataSource = new BindingSource(tmp, null);
            }

            ((ListBox)checkedListBox).DisplayMember = "Text";
            ((ListBox)checkedListBox).ValueMember = "Id";

现在,我的问题是,当我点击其中一个选项时,OnItemClicked事件会根据旧DataSource的内容触发并检查所选索引,然后进入checkedListBox_ItemCheck事件,我需要更改一些代码我故意点击的正确索引的检查状态,基于DataSource更改之前的位置。

例如:m_CheckBoxItems中有100个项目。我输入“d”,数据源只更改为以“d”开头的值。然后我点击其中一个项目(比如在第二行),然后点击混乱。 OnItemCheck事件触发包含根据我即点击的索引,并检查该索引。 然后它进入checkListBox_ItemCheck事件,其中包含我自己的代码,并检查属于我选择的特定行的原始索引(假设它是索引34)。

所以现在我检查了两个项目,而不仅仅是我想要的项目(索引34)

每个项目检查我还将该数据行放入选定数据行列表中以供将来处理,以便该部分是好的,我得到我点击的行(索引34)而不是错误检查的行(索引) 1)。

这是我的问题: 我怎样才能防止这种情况发生? 如何使checkedlistbox只检查我想要的行而不是两行?

0 个答案:

没有答案