C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataGridViewの不正値チェック

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■88633 / inTopicNo.1)  DataGridViewの不正値チェック
  
□投稿者/ まっさん (6回)-(2018/09/12(Wed) 13:43:46)

分類:[VB.NET/VB2005 以降] 

環境:VB2010 Windowsフォームアプリ

以下のような事を実現したいのですが、
    (1)DataGridViewにユーザーが不正な値を入力した場合はエラーアイコンを表示
    (2)セルの値が不正でなくなったら、エラーアイコンを消去

DataErrorをハンドリングして以下のようなコードで実験してみましたが、
もう一工夫したい点がいくつかあります。
(下記コードでDataGridViewのC1列にInteger以外を入力した場合の話です。)

    (a)ESCキー押下で入力をキャンセルした場合、エラーアイコンが消えない。
    (b)不正な値を入力してEnterキー押下で不正文字を選択状態にしたい。
    (c)エラーアイコンを行ヘッダに表示しているが、できればセルに表示したい。

    (c)は無理っぽい感じがしますが、上記を実現するにはどうすればいいでしょうか?

’-----------------------以下、実験コード-----------------------
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        dt.Columns.Add("C1", GetType(Integer))
        dt.Rows.Add(1)
        dt.AcceptChanges()
        DataGridView1.DataSource = dt
    End Sub
    Private Sub DataGridView1_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        DataGridView1.Rows(e.RowIndex).ErrorText = "セルの値を確認してください。"
        e.Cancel = True
    End Sub
    Private Sub DataGridView1_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
        If DataGridView1.Rows(e.RowIndex).ErrorText IsNot String.Empty Then
            DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
        End If
    End Sub

引用返信 編集キー/
■88636 / inTopicNo.2)  Re[1]: DataGridViewの不正値チェック
□投稿者/ まっさn (1回)-(2018/09/12(Wed) 20:17:59)
No88633 (まっさん さん) に返信
> 環境:VB2010 Windowsフォームアプリ
>
> 以下のような事を実現したいのですが、
> (1)DataGridViewにユーザーが不正な値を入力した場合はエラーアイコンを表示
> (2)セルの値が不正でなくなったら、エラーアイコンを消去
>
> DataErrorをハンドリングして以下のようなコードで実験してみましたが、
> もう一工夫したい点がいくつかあります。
> (下記コードでDataGridViewのC1列にInteger以外を入力した場合の話です。)
>
> (a)ESCキー押下で入力をキャンセルした場合、エラーアイコンが消えない。
> (b)不正な値を入力してEnterキー押下で不正文字を選択状態にしたい。
> (c)エラーアイコンを行ヘッダに表示しているが、できればセルに表示したい。
>
> (c)は無理っぽい感じがしますが、上記を実現するにはどうすればいいでしょうか?
>
> ’-----------------------以下、実験コード-----------------------
> Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
> Dim dt As New DataTable
> dt.Columns.Add("C1", GetType(Integer))
> dt.Rows.Add(1)
> dt.AcceptChanges()
> DataGridView1.DataSource = dt
> End Sub
> Private Sub DataGridView1_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
> DataGridView1.Rows(e.RowIndex).ErrorText = "セルの値を確認してください。"
> e.Cancel = True
> End Sub
> Private Sub DataGridView1_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
> If DataGridView1.Rows(e.RowIndex).ErrorText IsNot String.Empty Then
> DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
> End If
> End Sub
引用返信 編集キー/
■88637 / inTopicNo.3)  Re[1]: DataGridViewの不正値チェック
□投稿者/ まっさん (7回)-(2018/09/12(Wed) 20:21:59)
No88633 (まっさん さん) に返信

すみません。↑は間違って投稿してしまいました。
(c)以外は以下で、一応希望通りに動作しているように思います。

    '編集中セルの行番号、列番号、EditingControl
    Private _textbox As Tuple(Of Integer, Integer, DataGridViewTextBoxEditingControl)
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        dt.Columns.Add("C1", GetType(Integer))
        dt.Rows.Add(1)
        dt.AcceptChanges()
        DataGridView1.DataSource = dt
    End Sub

    Private Sub DataGridView1_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        DataGridView1.Rows(e.RowIndex).ErrorText = "セルの値を確認してください。"
        '念の為、行番号、列番号も照合する
        If _textbox IsNot Nothing AndAlso _textbox.Item1 = e.RowIndex AndAlso _textbox.Item2 = e.ColumnIndex Then
            _textbox.Item3.SelectAll()
        End If
        e.Cancel = True
    End Sub
    Private Sub DataGridView1_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
        If DataGridView1.Rows(e.RowIndex).ErrorText IsNot String.Empty Then
            DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
        End If
    End Sub
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
        ByVal e As DataGridViewEditingControlShowingEventArgs) _
        Handles DataGridView1.EditingControlShowing
        If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
            Dim tbox = DirectCast(e.Control, DataGridViewTextBoxEditingControl)
            Dim cell = DataGridView1.CurrentCell
            _textbox = Tuple.Create(cell.RowIndex, cell.ColumnIndex, tbox)
        Else
            _textbox = Nothing
        End If
    End Sub
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        DataGridView1.CurrentCell = Nothing
        DataGridView1.CurrentCell = DataGridView1(e.ColumnIndex, e.RowIndex)
    End Sub

引用返信 編集キー/
■88643 / inTopicNo.4)  Re[2]: DataGridViewの不正値チェック
□投稿者/ まっさん (8回)-(2018/09/12(Wed) 21:24:57)
No88637 (まっさん さん) に返信

編集中のTextBoxにアイコンを表示するのは力技になりそうなので以下のように
ToolTipでエラー表示するようにしました。
独り相撲で申し訳ありませんでした。

  '編集中セルの行番号、列番号、EditingControl
    Private _textbox As Tuple(Of Integer, Integer, DataGridViewTextBoxEditingControl)
    Private _toolTip As New ToolTip
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        dt.Columns.Add("C1", GetType(Integer))
        dt.Rows.Add(1)
        dt.AcceptChanges()
        DataGridView1.DataSource = dt
    End Sub
    Private Sub DataGridView1_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        '念の為、行番号、列番号も照合する
        If _textbox IsNot Nothing AndAlso _textbox.Item1 = e.RowIndex AndAlso _textbox.Item2 = e.ColumnIndex Then
            _textbox.Item3.SelectAll()
            'ツールチップを表示
            _toolTip.SetToolTip(_textbox.Item3, "セルの値を確認してください。")
            _toolTip.ToolTipIcon = ToolTipIcon.Error
            _toolTip.Active = True
        End If
        e.Cancel = True
    End Sub
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
        ByVal e As DataGridViewEditingControlShowingEventArgs) _
        Handles DataGridView1.EditingControlShowing
        If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
            Dim tbox = DirectCast(e.Control, DataGridViewTextBoxEditingControl)
            Dim cell = DataGridView1.CurrentCell
            _textbox = Tuple.Create(cell.RowIndex, cell.ColumnIndex, tbox)
        Else
            _textbox = Nothing
        End If
    End Sub
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        _toolTip.Active = False
    End Sub

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ