我已经为这个问题苦苦挣扎了几天,但我还没有找到任何答案;我创建了一个ToolStripMenu
从存储过程动态填充的数组:
ToolStripMenuItem[] itemsDepto = null;
itemsDepto = new ToolStripMenuItem[data.Tables[0].Rows.Count];
for (int i = 0; i <= data.Tables[0].Rows.Count - 1; i++)
{
itemsDepto[i] = new ToolStripMenuItem();
itemsDepto[i].Tag = data.Tables[0].Rows[i].ItemArray[0];
itemsDepto[i].Text = data.Tables[0].Rows[i].ItemArray[1].ToString();
itemsDepto[i].CheckOnClick = true;
itemsDepto[i].Checked = true;
itemsDepto[i].Click += DeptoFilter_Click;
deptoList.Add(data.Tables[0].Rows[i].ItemArray[1].ToString());
}
tsmiDepartamento.DropDownItems.AddRange(itemsDepto);
我想要实现的是使用它ToolStripMenu
作为用户的过滤器控件,默认情况下是选中的,所以当用户取消选中菜单时,它应该过滤包含未选中内容的行。
在单击事件中,我根据菜单按钮的状态在列表中添加和删除值,如下例所示:
private void DeptoFilter_Click(object sender, EventArgs e)
{
ToolStripMenuItem temp = new ToolStripMenuItem();
temp = (ToolStripMenuItem)sender;
BindingSource bind = new BindingSource();
bind.DataSource = dgvPersonalTotal.DataSource;
if (temp.CheckState == CheckState.Checked)
{
deptoList.Add(sender.ToString());
}
else
{
deptoList.Remove(sender.ToString());
}
bind.Filter = "Departamento NOT IN (" + /*LIST*/"" + ")";
dgvPersonalTotal.DataSource = bind;
//foreach (string x in deptoList)
//{
//}
}
但是我遇到的一个大问题是,如何使用列表来过滤绑定源,正如您在代码中看到的那样,我不能只使用列表,甚至尝试在 foreach 中使用 BindingSource.Filter,我不'不知道如何解决这个问题,所以任何想法都值得赞赏。