類似BOOLEAN列的DATAGRIDTEXTBOX的改進與重寫

來源:互聯網
上載者:User
datagrid

在這裡我們來講一篇關於如何進行資料列內容與顯示操作的方法。這種方法類似於實現:有資料表test(id int not null primary key ,name varchar(20) ,sex bit ), 那麼是否有方法不通過直接使用sql語句,如:select id ,name ,sex =case sex ( when true then ‘男’ when false then ‘女’ else sex end) 的形式來構建要顯示的是“男”,“女”,而實際上儲存的是true和false呢?當然,如果我們使用datagridboolcolumn,通過設定它的一些屬性(truevalue,falsevalue)可以達到類似的效果,但對於那些非bit列呢?回答是肯定的。我們使用繼承datagridtextboxcolumn類,然後重寫GetColumnValueAtRow方法,來達到效果。GetColumnValueAtRow方法,把要從資料來源的資料取出,然後判斷後,返回我們想要在網格中顯示的值。(代碼見後面的詳細代碼)

這樣,我們可以順利地在網格中顯示我們想要的資料了,但是還有另外一個問題,就是如果我們想在網格中修改資料,那麼是否可以被提交給資料庫呢?如果僅僅通過上面的操作,只是達到了顯示的目的,還要重寫edit,commit,abort方法,來達到點擊儲存格後修改內容,然後提交,最後更新到資料庫。

 效果圖1下面是程式的完整代碼,這裡只是拋磚引玉,希望你可以根據需要來作出相應的改進。

'************************************************************************************

'程式名稱:CanSetValueDatagridTextbox

'功能說明:繼承自datagridtextboxcolumn類的列樣式,主要實現顯示值與實際值的顯示與更新                                                

'參數說明:無

'傳回值  :cansetvaluedatagridtextbox

'編寫人員:閔峰

'日期時間:2005-06-16上午

'遺留問題:點擊欄位標題排序會發生顯示值的改變,這是一個bug嗎?有待解決

'************************************************************************************

Public Class cansetvaluedatagridtextbox

    Inherits System.Windows.Forms.DataGridTextBoxColumn

 

#Region " Windows 表單設計器產生的程式碼 "

 

    Public Sub New()

        MyBase.New()

 

        '該調用是 Windows 表單設計器所必需的。

        InitializeComponent()

 

        '在 InitializeComponent() 調用之後添加任何初始化

 

    End Sub

 

    'UserControl 重寫 dispose 以清理組件列表。

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Windows 表單設計器所必需的

    Private components As System.ComponentModel.IContainer

 

    '注意:以下過程是 Windows 表單設計器所必需的

    '可以使用 Windows 表單設計器修改此過程。

    '不要使用代碼編輯器修改它。

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        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

 

    '放棄的處理

    Protected Overrides Sub Abort(ByVal rowNum As Integer)

        Console.WriteLine("abort")

        isediting = False

        Me.TextBox.Text = oldvalue

        Me.Invalidate()

    End Sub

 

    '顯示類型轉換函式

    Private Function getchangetype(ByVal s As String) As Object

        Select Case m_type.ToString

            Case "System.Integer"

                Console.WriteLine("integer")

                Return Convert.ToInt32(s)

            Case "System.Boolean"

                Console.WriteLine("boolean")

                Return Convert.ToBoolean(s)

            Case "System.String"

                Return s

            Case "System.Decimal"

                Return Convert.ToDecimal(s)

        End Select

    End Function

    Private Function setsuitablevalue(ByVal s As String) As Object

        If s = Me.NullText Then

            Return DBNull.Value

        ElseIf s = m_displaytrue Then

            Return getchangetype(m_valuetrue)

        ElseIf s = m_displayfalse Then

            Return getchangetype(m_valuefalse)

        Else

            Throw New Exception("輸入非法,請檢查輸入後準備提交的值!")

        End If

    End Function

End Class

 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。