“BindingNavigator”如何在删除前弹出确认框?
问题的缘起在于有一个学习数据操作的人询问我“BindingNavigator”如何点击“删除”前进行确认。我一开始模拟创建了一个表,然后通过设计器的方式生成了这四类控件,随后拖拽一个Navigator到WinForm上,双击红色叉叉部分,写入一个MessageBox判断用户究竟是否需要取消——显然不起作用。
于是反推引发该Delete事件的方法必然是先调用了SQL相关语句删除了当前记录,然后引发了Delete事件,于是兴冲冲地查看BindingNavigator关于Delete的方法,希望可以重写——
[C#]
private void OnDelete(object sender, EventArgs e) { if (this.Validate() && (this.bindingSource != null)) { this.bindingSource.RemoveCurrent(); this.RefreshItemsInternal(); } }
[VB.NET]
Private Sub OnDelete(ByVal sender As Object, ByVal e As EventArgs) If (Me.Validate AndAlso (Not Me.bindingSource Is Nothing)) Then Me.bindingSource.RemoveCurrent Me.RefreshItemsInternal End If End Sub
Fuck(请抱歉我说粗话了)——这个方法竟然是私有的!
怎么办?也没有任何Deleting(进行时)的事件啥的……欲哭无泪的我无意发现这样一个属性:DeleteItem——这个控件如果设置为“空”(Null),那么完全就可以让你自己来编程啦!于是:
1)先设置DeleteItem为空,不让它调用自动生成的删除代码(因为我要自己编写逻辑滴!)
2)代码如下(这里MyData啥的全都是生成的强类型数据集):
[C#]
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e) { if (MessageBox.Show("确认删除吗?", "删除前确认", MessageBoxButtons.OKCancel) == DialogResult.OK) { myDbTestDataSet.myTable.Rows[bindingNavigator1.BindingSource.Position].Delete(); } }
[VB.NET]
Private Sub bindingNavigatorDeleteItem_Click(sender As Object, e As EventArgs) If MessageBox.Show("确认删除吗?", "删除前确认", MessageBoxButtons.OKCancel) = DialogResult.OK Then myDbTestDataSet.myTable.Rows(bindingNavigator1.BindingSource.Position).Delete() End If End Sub
一般地,BindingNavigator上面全部的按钮——绑定到数据源的时候(假设生成了CRUD等方法),都有两大类运行模式:
1)自动,就是默认设置,无需做任何操作。
2)手动,像我设置一样——把XXXItem设置为“空”(Null),然后编码进行。此时的Navigator好比只是一个带有数据源的一个普通工具条,你完全可以自定义。