我有一个自定义的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只检查我想要的行而不是两行?