在我的DataGrid中,我在第一列中使用了一个ComboBox,因此它将使用DisplayMember
和ValueMember
概念从数据库中获取一些数据。现在我想从先前选择的ComboBox中删除该值。
填充ComboBox代码如下:
dTable = getDummyTable.GetDummyTble("Dummy", "DNO", "All");
dCmbData = dTable;
cmbDeno.DataSource = dTable;
cmbDeno.DisplayMember = "dyName";
cmbDeno.ValueMember = "dyRemarks";
下一行选择不应该是ComboBox中的重复值。
我怎样才能做到这一点?
任何人都可以帮我吗?
答案 0 :(得分:1)
好好试试这个。你有用于绑定所有组合的DataTable(如果我错了,请纠正我)。现在我们需要做的是,当从任何组合中选择一个项目时,我们需要从所有其他组合中删除该项目)。您需要声明一个类级别字典来存储哪个组合具有之前存储的值:
IDictionary<ComboBox, DataRow> _prevSelection;
//Please don't mind if syntax is wrong worked too long in web
comboBox.OnSelectedIndexChanged += fixItems;
private void fixItems(object sender, EventArgs e)
{
var cbo= sender as ComboBox;
if(cbo==null) return;
var prev = _prevSelection[cbo];
var row=<GET ROW FROM DATATABLE FOR CURRENT SELECTED VALUE>;
_prevSelection[cbo] = row;
UpdateOtherCombos(cbo, prev, cbo.SelectedItem.Value);
}
private void UpdateOtherCombos(ComboBox cbo, DataRow prev, object toRemove)
{
foreach(var gridrow in <YourGrid>.Rows)
{
var c = <FIND COMBO IN ROW>;
if(cbo.Id == c.Id) continue;//combo that triggered this all
var itemToRemove=null;
foreach(var item in c.Items)
{
if(item.Value == toRemove)
{
itemToRemove = item;
break;
}
}
//or you can get index of item and remove using index
c.Items.Remove(itemToRemove);
//Now add the item that was previously selected in this combo (that
//triggered this all)
c.Items.Add(new ComboBoxItem{Value = prev["ValueColumn"],
Text = prev ["TextColumn"]});
}
}
这只是为了给你一个可以帮助你找到最佳解决方案的想法,而不是迭代所有组合,因为如果网格中有太多行或组合中有太多项目,它会减慢速度。即便如此,您还需要设置一些功能/代码才能使其正常工作。另请注意,我有一段时间没有使用过WinForms,你需要检查ComboBoxItem
等内容以及它们所调用的任何函数是否存在。 :)