根据条件从数据表中删除行

时间:2014-01-20 11:02:49

标签: c# combobox

在我的DataGrid中,我在第一列中使用了一个ComboBox,因此它将使用DisplayMemberValueMember概念从数据库中获取一些数据。现在我想从先前选择的ComboBox中删除该值。

填充ComboBox代码如下:

   dTable = getDummyTable.GetDummyTble("Dummy", "DNO", "All");
   dCmbData = dTable;
   cmbDeno.DataSource = dTable;
   cmbDeno.DisplayMember = "dyName";
   cmbDeno.ValueMember = "dyRemarks";

下一行选择不应该是ComboBox中的重复值。

我怎样才能做到这一点?

任何人都可以帮我吗?

1 个答案:

答案 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等内容以及它们所调用的任何函数是否存在。 :)