使用BindingNavigator删除列表项,而不是正确的项

时间:2011-01-25 16:06:01

标签: c# .net binding bindingsource

我使用BindingNavigator通过datagridview从产品列表中删除项目。 (methodcall main.DeleteProduct()调用存储库从数据库中删除。)

我需要一些帮助来改进..DeleteItem_Click事件的代码。当我单击一个单元格/行,然后单击删除按钮(BindingNavigator)时,它永远不会删除该行。它删除下面的行,或者它是最后一行,上面的行,如果只有一行,则抛出null。 bindingSource.Current不应该与datagridview的currentrow相同吗?

另外,我使用bindingsource构建当前项目的方式是一种好方法吗?如果你有更好的代码建议会更好。

干杯!

 public partial class Form1 : Form
{      
    private MainBL main = new MainBL(); 
    private   List<Product> products = new List<Product>

    private void Form1_Load(object sender, EventArgs e)
    {

        bsProducts.DataSource = products;         // BindingSource
        bnProducts.BindingSource = bsProducts;    // BindingNavigator
        dataGridView1.DataSource = bsProducts;    //
    }

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {

        Product product = (Product)bsProducts.Current;

       // Putting a breakpoint here, shows the identity property is not the same
       // as row selected in datagridview. 

        main.DeleteProduct(product);

    }

3 个答案:

答案 0 :(得分:3)

更好的解决方案可能是拦截/删除Binding Navigator的删除事件,并手动处理删除。

转到Binding Navigator;在“属性”窗口中打开属性。找到DeleteItem属性(在“Items”类别下),并将其设置为“(none)”。

现在,您可以在关联工具栏中的“删除”按钮的单击事件中编写删除功能。上一个答案中的代码将起作用 - 您现在可以获得正确的“当前”项目。如果需要,您也可以在此处添加确认检查(“您确定吗?”)。

当然,不要忘记从BindingSource绑定的集合中删除该项(或者只是刷新数据)。

答案 1 :(得分:2)

我现在明白在CellClick事件触发之前删除了该行。所以我通过将代码放在删除按钮的_MouseDown事件中使其按预期工作。不确定这是否是最合适的解决方案..

    private void btnDeleteProducts_MouseDown(object sender, MouseEventArgs e)
    {
        Product product = (Product)bsProducts.Current;
        if (product != null)
        {
           main.DeleteProduct(product);
        }                 
    }

答案 2 :(得分:0)

我遇到过这个并做了类似于OP [bretddog]的事情,但我写了一个更完整的方法。

我在这里分享我的工作:

public class YourDataItem
{
    // put all of your data here. This is just stubbed here as an example
    public int Id { get; set; }
    public String Description { get; set; }
}

private void DeleteBtn_Down(Object sender, MouseEventArgs e)
{
    var item = (YourDataItem)bindingSource1.Current;
    var dr = DialogResult.None;
    if (0 < item.Id)
    {
        var ask = String.Format("Delete Item [{0}]?", item.Description);
        dr = MessageBox.Show(ask, "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    }
    if (dr == DialogResult.Yes)
    {
        try
        {
            bindingSource1.EndEdit();
            _datamodel.YourDataItems.DeleteOnSubmit(item);
            _datamodel.SubmitChanges();
            _datamodel.ClearCache();
            bindingSource1.SetPosition<YourDataItem>(x => x.Id == 0);
        } catch (Exception err)
        {
            MessageBox.Show("Database changes failed to complete.", String.Format("Delete {0}", err.GetType()), MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    } else
    {
        bindingSource1.CancelEdit();
    }
}

Linq数据源可能会超时。

如果有人在当天回家的时候点击删除按钮,第二天会在确认对话框中点击“确定”,try...catch将处理对象处理异常。

ClearCache()只是一个众所周知的DataContext扩展:

/// <summary>
/// Clears the cache from a DataContext to insure data is refreshed
/// </summary>
/// <param name="dc"></param>
public static void ClearCache(this DataContext dc)
{
    dc.GetType().InvokeMember("ClearCache", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, dc, null);
}