类似BOOLEAN列的DATAGRIDTEXTBOX的改进
作者: 来源: 添加时间:2006-5-21 20:01:06'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
components = New System.ComponentModel.Container() End Sub #End Region Private rnum As Integer '列序号 Private rname As String = "" '列名称 Private m_type As Type '列的类型 Public Sub New(ByVal source As DataTable, ByVal rnum As Integer, ByVal displaytrue As String, ByVal truevalue As String, _ ByVal displayfalse As String, ByVal falsevalue As String) rnum = rnum m_displaytrue = displaytrue m_valuetrue = truevalue m_displayfalse = displayfalse m_valuefalse = falsevalue m_type = source.Columns(rnum).DataType End Sub Public Sub New(ByVal source As DataTable, ByVal rname As String, ByVal displaytrue As String, ByVal truevalue As String, _ ByVal displayfalse As String, ByVal falsevalue As String) rname = rname m_displaytrue = displaytrue m_valuetrue = truevalue m_displayfalse = displayfalse m_valuefalse = falsevalue m_type = source.Columns(rname).GetType End Sub Private m_displaytrue As String '显示的真值 Private m_displayfalse As String '显示的假值 Private m_valuefalse As String '存储的假值 Private m_valuetrue As String '存储的真值 '-------------以下内容操作数据的显示--------------- '重写该过程是为了以合适的形式来显示数据(★) Protected Overrides Function GetColumnValueAtRow(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Object '从数据源获得指定行的数据(注意:这里使用的类型是object) Dim Result As Object = MyBase.GetColumnValueAtRow(source, rowNum) '显示的设置 If Result.ToString = m_valuetrue Then Return Me.m_displaytrue ElseIf Result.ToString = m_valuefalse Then Return Me.m_displayfalse ElseIf Result Is DBNull.Value Then If Me.NullText Is Nothing Then Return DBNull.Value Else Return Me.NullText End If Else Throw New Exception("该列中存在没有指定显示的字符!") End If End Function '---------------以下内容操作更新------------------ Private isediting As Boolean = False '是否在修改状态 Private oldvalue As Object '原始值 '点击单元格,准备编辑(★) Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean) Console.WriteLine("edit") '--------- '直接触发父类事件,是为了达到点击后选中文本的效果。(如果不触发就要自己把textbox移动到对应的边框内) MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible) '设置修改码 isediting = True '记录原始值 oldvalue = Me.GetColumnValueAtRow(source, rowNum) End Sub '对输入的修改进行提交(★) Protected Overrides Function Commit(ByVal dataSource As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Boolean Console.WriteLine("in commit") '--------- '如果修改码为真则意味着修改完毕 If Not isediting Then Return True '获得单元格的内容 Dim currentvalue As Object = Me.TextBox.Text Console.WriteLine(currentvalue) '--------- Try currentvalue = setsuitablevalue(currentvalue) SetColumnValueAtRow(dataSource, rowNum, currentvalue) Catch ex As Exception Return False End Try isediting = False Invalidate() Console.WriteLine("out commit") '--------- Return True End Function