VB.NET中 数据窗体向导(2)

2007-12-06  来源:   浏览次数 1
对新增加行进行数值验证

If e.Action = DataRowAction.Add Then



'此处为了简单,以字段au_id不能为""为例

If editau_id.Text = "" Then

Throw (New Exception("数据不能为空"))

End If

End If



'还可以对记录的编辑值进行验证

'If e.Action = DataRowAction.Change Then

'此处填入编辑验证代码

'End If

'其它验证,依照上面加入吧



End Sub

要启动rowchanging事件处理,请在程序的适当位置加入如下语句(本人是加在LoadDataSet()方法中的语句objDS.Merge(objDataSetTemp)后面)。

AddHandler objDS.authors.authorsRowChanging, AddressOf row_changing



二、 虽然有不允许为Null值的字段,但全部都能绑定到TextBox类控件

为了说明方便,我们再利用“数据窗体向导”新建一窗体(注:新窗体可以建在上一个窗体的同一个项目中,数据窗体的名称是“demo2”,新建数据集名称为“ds2”),该数据窗体是绑定到“pubs”数据库中的“employee”表。如图二所示,该表中的所有不允许为Null值的字段都能绑定到TextBox类控件。



运行该窗体后,单击“加载”后可以新增记录(编号为44的记录),但是如果新增记录后不输入任何值而单击任一导航按钮(比如上一条“<”),会出现如图三所示错误。



这一类错误较轻,完全可以采用第一种情况的解决方法,当然如果你嫌多的话,还可以采用如下更为简单的方法: 在“数据窗体向导”自动生成的代码中,只需对四个导航按钮(第一条、上一条、下一条、最后一条)的单击事件处理程序代码进行适当修改(注意:还是按照第一种情况中四个导航按钮的代码修改方法进行修改),其它代码不变也不增加,一切就0k了,此时再试试,你会见到如图四友好的界面,提示你必须对不允许空值的列字段进行输入,然后才能改变记录位置。



三、 总结

当有不许Null值的字段绑定到数据窗体上时,为了避免出现新增记录错误,在上面笔者介绍了可以在代码中找到解决办法,另外我们还可以在数据集中找到解决办法:“在数据集的架构中,对不允许Null值的列字段给它设置一默认值即可”,当然具体采用哪种解决方法还是请你根据实际情况灵活选择。

上面给出了第一种情况的主要解决代码,末尽之处请大家参照下边完整代码。

Public Class DEMO

Inherits System.Windows.Forms.Form



'为了简化,“Windows 窗体设计器生成的代码”去掉了,记住在“数据窗体向导”执行时按照以下要求即可。

'数据窗体实例的名称是“DEMO”,数据集的名称是“DS”,数据连接是以SQL Server 2000中

'的“pubs” 示例数据库为例,选择“authors”表、“单个控件的单个记录”显示样式,其它都采用的默认值。



Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click

Me.BindingContext(objDS, "authors").CancelCurrentEdit()

Me.objDS_PositionChanged()

End Sub



Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click

If (Me.BindingContext(objDS, "authors").Count > 0) Then

Me.BindingContext(objDS, "authors").RemoveAt(Me.BindingContext(objDS, "authors").Position)

Me.objDS_PositionChanged()

End If

End Sub



Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click

Try

Me.BindingContext(objDS, "authors").EndCurrentEdit()

Me.BindingContext(objDS, "authors").SuspendBinding()

Me.BindingContext(objDS, "authors").AddNew()

Dim i As Integer

For i = 0 To objDS.authors.Columns.Count - 1

If objDS.Tables("authors").Columns(i).AllowDBNull = False Then

Dim j As Integer

For j = 0 To Me.BindingContext(objDS, "authors").Bindings.Count - 1

If Me.BindingContext(objDS, "authors").Bindings(j).BindingMemberInfo.BindingField = _

objDS.authors.Columns(i).ColumnName Then

If BindingContext(objDS, "authors").Bindings(j).PropertyName() = "Text" Then

Me.BindingContext(objDS, "authors").Current(j) = ""

'BindingContext(objDS, "authors").Current(i) = BindingContext(objDS, "authors"). _

' Bindings(j).Control.Text()

Exit For

Else

If BindingContext(objDS, "authors").Bindings(j).PropertyName = "Checked" Then

Me.BindingContext(objDS, "authors").Current(j) = True

'Dim tmpobj As Object

'tmpobj = BindingContext(objDS, "authors").Bindings(i).Control

'tmpobj = CType(tmpobj, CheckBox)

'Me.BindingContext(objDS, "authors").Current(i) = tmpobj.checked

Exit For

End If

End If

End If

Next

End If

Next

Me.BindingContext(objDS, "authors").ResumeBinding()

Me.BindingContext(objDS, "authors").Position = Me.BindingContext(objDS, "authors").Count - 1

Catch eEndEdit As System.Exception

System.Windows.Forms.MessageBox.Show(eEndEdit.Message)

Me.BindingContext(objDS, "authors").CancelCurrentEdit()

Me.BindingContext(objDS, "authors").ResumeBinding()

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click

Try

'尝试更新数据源。

Me.UpdateDataSet()

Catch eUpdate As System.Exception

'在此处添加错误处理代码。

'显示错误信息(如果有)。

objDS.RejectChanges() '我增加的语句

System.Windows.Forms.MessageBox.Show(eUpdate.Message)

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

Try

'尝试加载数据集。

Me.LoadDataSet()

Catch eLoad As System.Exception

'在此处添加错误处理代码。

'显示错误信息(如果有)。

System.Windows.Forms.MessageBox.Show(eLoad.Message) End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnNavFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavFirst.Click

Try

Me.BindingContext(objDS, "authors").Position = 0

Catch ex As Exception

MessageBox.Show(ex.Message)

Exit Sub

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click

' Me.BindingContext(objDS, "authors").Position = (Me.objDS.Tables("authors").Rows.Count - 1)

Try

'注意下一条语句我进行了修改

Me.BindingContext(objDS, "authors").Position = Me.BindingContext(objDS, "authors").Count - 1

Catch ex As Exception

MessageBox.Show(ex.Message)

Exit Sub

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnNavPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavPrev.Click

Try '采用try语句进行错误检查(Null及唯一性)

Me.BindingContext(objDS, "authors").Position = (Me.BindingContext(objDS, "authors").Position - 1)

Catch ex As Exception

MessageBox.Show(ex.Message)

Exit Sub '如有错误,不许移动位置

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub btnNavNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavNext.Click

'If BindingContext(objDS, "authors").Position = BindingContext(objDS, "authors").Count - 1 Then '可不要

' MessageBox.Show("数据到顶了!")

' Exit Sub

'End If

Try

Me.BindingContext(objDS, "authors").Position = (Me.BindingContext(objDS, "authors").Position + 1)

Catch ex As Exception

MessageBox.Show(ex.Message)

Exit Sub

End Try

Me.objDS_PositionChanged()

End Sub



Private Sub objDS_PositionChanged()

Me.lblNavLocation.Text = (((Me.BindingContext(objDS, "authors").Position + 1).ToString + " 的 ") _

+ Me.BindingContext(objDS, "authors").Count.ToString)



End Sub



Private Sub btnCancelAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelAll.Click

Me.objDS.RejectChanges()

Me.objDS_PositionChanged() '我增加的语句

End Sub



Public Sub UpdateDataSet()

'创建一个新数据集来保存对主数据集所做的更改。

Dim objDataSetChanges As DS = New DS

'停止当前的任何编辑。

Me.BindingContext(objDS, "authors").EndCurrentEdit()

'获取对主数据集所做的更改。

objDataSetChanges = CType(objDS.GetChanges, DS)

'检查是否做了任何更改。

If (Not (objDataSetChanges) Is Nothing) Then

Try

'需要做一些更改,所以尝试通过调用 update 方法

'和传递数据集以及任何参数来更新数据源。

Me.UpdateDataSource(objDataSetChanges)

objDS.Merge(objDataSetChanges)

objDS.AcceptChanges()

Catch eUpdate As System.Exception

'在此处添加错误处理代码。

Throw eUpdate

End Try

'添加代码以检查返回的数据集中是否有任何可能已被

'推入到行对象错误中的错误。

End If

End Sub



Public Sub LoadDataSet()

'创建一个新数据集以保存从 FillDataSet 调用返回的记录。

'使用了一个临时数据集,这是因为填充现有的数据集

'需要重新绑定数据绑定。

Dim objDataSetTemp As DS

objDataSetTemp = New DS

Try

'尝试填充临时数据集。

Me.FillDataSet(objDataSetTemp)

Catch eFillDataSet As System.Exception

'在此处添加错误处理代码。

Throw eFillDataSet

End Try

Try

'清空数据集中的旧记录。

objDS.Clear()

'将记录合并到主数据集中。

objDS.Merge(objDataSetTemp)



'我在此处加入rowchanging事件

AddHandler objDS.authors.authorsRowChanging, AddressOf row_changing



Catch eLoadMerge As System.Exception

'在此处添加错误处理代码。

Throw eLoadMerge

End Try

End Sub



Public Sub UpdateDataSource(ByVal ChangedRows As DS)

Try

'在有挂起的更改时,只需要更新数据源即可。

If (Not (ChangedRows) Is Nothing) Then

'打开连接。

Me.OleDbConnection1.Open()

'尝试更新数据源。

OleDbDataAdapter1.Update(ChangedRows)

End If

Catch updateException As System.Exception

'在此处添加错误处理代码。

Throw updateException

Finally

'无论是否引发了异常都关闭连接。

Me.OleDbConnection1.Close()

End Try

End Sub



Public Sub FillDataSet(ByVal dataSet As DS)

'在填充数据集前关闭约束检查。

'这允许适配器填充数据集而不用考虑

'表之间的依赖项。

dataSet.EnforceConstraints = False

Try

'打开连接。

Me.OleDbConnection1.Open()

'尝试通过 OleDbDataAdapter1 填充数据集。

Me.OleDbDataAdapter1.Fill(dataSet)

Catch fillException As System.Exception

'在此处添加错误处理代码。

Throw fillException

Finally

'重新打开约束检查。

dataSet.EnforceConstraints = True

'无论是否引发了异常都关闭连接。

Me.OleDbConnection1.Close()

End Try

End Sub



Private Sub row_changing(ByVal sender As Object, ByVal e As DS.authorsRowChangeEvent)

'对新增加行进行数值验证

If e.Action = DataRowAction.Add Then



'此处为了简单,以字段au_id不能为""为例

If editau_id.Text = "" Then

Throw (New Exception("数据不能为空"))

End If

End If



'还可以对记录的编辑值进行验证

'If e.Action = DataRowAction.Change Then

'此处填入编辑验证代码

'End If

'其它验证,依照上面加入吧

End Sub

End Class

以上代码在Microsoft Visual Studio .NET 2003 + SQL Server 2000中的“pubs” 示例数据库中调试通过。

相关主题:

网友评论