我使用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);
}
答案 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);
}