none
請問TextBox如果Binding的是數字欄位問題 RRS feed

  • 問題

  • 如果TextBox的Binding欄位是數字格式
    如果原本資料庫存的是0
    Binding到TextBox後
    將該TextBox清為空白
    此時焦點無法移到其他地方
    有沒有辦法解決?
    2009年6月5日 上午 07:16

解答

  • Brian:
        這有個問題,既然資料已經繫結上了一個數值欄位,你就不該讓TextBox的內容變成空白.不然就應該把欄位改為文字型態.
        另外一個方法是在TextBox的Leave事件中偵測,當此TextBox的Text.length=0時將Text屬性值設為0
        像以下這樣
        Private Sub MTB_Credit_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MTB_Credit.Leave
            If MTB_Credit.Text.Length = 0 Then
                MTB_Credit.Text = "0"
            End If
        End Sub
    • 已標示為解答 Lolota Lee 2009年6月11日 上午 07:03
    2009年6月9日 上午 08:55
    版主
  • 一般資料庫上使用int這種類型的欄位資料時就如同bill大所說,該欄位不應該有空白的情形發生,比較簡單的方式就是該欄位變更為"文字"類型的,這樣就可以接受"空白"的輸入。

    要硬做也是可以,要在該控制項的驗證事件中,手動將"空白"轉換成"NULL",因為使用者是沒辦法去輸入"NULL"這東東的,例如下面這樣(我是以BindSource繫結DataSet)

    Private Sub txtTmp_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTmp.Validating
            If txtTmp.Text = "" Then
                Dim DV As DataRowView
                DV = MyBindSource.Current
                DV.BeginEdit()
                DV.Item("My_IntColumnName") = DBNull.Value
                DV.EndEdit()
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Lolota Lee 2009年6月11日 上午 07:03
    2009年6月9日 下午 12:39

所有回覆

  • Brian:
        你的TextBox的Binding來源是個Datatable吧?你可以中間用一個BindingSource去做
        TextBox => BindingSource => Datatable
        利用 BindingSource的CurrentChanged事件檢查Binding進來的值是否為0  
        如果是0則使用TextBox的Clear方法將內容清空,並且用Focus方法將焦點移到TextBox上
        然後在 Textbox的LostFocus事件中檢查 TextText的 Text 長度是否大於 1
        如果是小於 1則用Focus方法將焦點移到TextBox上,這樣就移不走了
        詳情請參閱 MSDN文件庫
        [BindingSource類別]
        [BindingSource.CurrentChanged 事件]

       
    • 已提議為解答 bauann 2009年6月9日 上午 07:32
    • 已取消提議為解答 Brian Hsu 2009年6月9日 上午 08:33
    2009年6月5日 上午 09:24
    版主
  • 要驗證輸入值的話還是要用TextBox1_Validating的事件去做,用CurrentChange的話因為是Row指標變化後才會引發,所以錯誤會檔不到


    編輯附註---
       哎呀呀,我誤會bill大的意思了,請當成怪叔叔來亂的,不用理會這篇..

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已編輯 bauann 2009年6月5日 下午 02:25
    2009年6月5日 下午 02:21
  • 抱歉
    我的意思是現在如果資料庫原本有存數值
    Binding到TextBox後,如果清空TextBox
    我無法從TextBox移開焦點
    以上指的是問題,我該如何才能解決問題這個問題
    而不是我要這個效果
    2009年6月9日 上午 08:37
  • Brian:
        這有個問題,既然資料已經繫結上了一個數值欄位,你就不該讓TextBox的內容變成空白.不然就應該把欄位改為文字型態.
        另外一個方法是在TextBox的Leave事件中偵測,當此TextBox的Text.length=0時將Text屬性值設為0
        像以下這樣
        Private Sub MTB_Credit_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MTB_Credit.Leave
            If MTB_Credit.Text.Length = 0 Then
                MTB_Credit.Text = "0"
            End If
        End Sub
    • 已標示為解答 Lolota Lee 2009年6月11日 上午 07:03
    2009年6月9日 上午 08:55
    版主
  • 但因數字欄位也可以是null值
    2009年6月9日 上午 09:32
  • 一般資料庫上使用int這種類型的欄位資料時就如同bill大所說,該欄位不應該有空白的情形發生,比較簡單的方式就是該欄位變更為"文字"類型的,這樣就可以接受"空白"的輸入。

    要硬做也是可以,要在該控制項的驗證事件中,手動將"空白"轉換成"NULL",因為使用者是沒辦法去輸入"NULL"這東東的,例如下面這樣(我是以BindSource繫結DataSet)

    Private Sub txtTmp_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTmp.Validating
            If txtTmp.Text = "" Then
                Dim DV As DataRowView
                DV = MyBindSource.Current
                DV.BeginEdit()
                DV.Item("My_IntColumnName") = DBNull.Value
                DV.EndEdit()
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Lolota Lee 2009年6月11日 上午 07:03
    2009年6月9日 下午 12:39