DataGridView控件用法合集(十)

来源:互联网 发布:个人日常事务管理软件 编辑:程序博客网 时间:2024/06/07 02:02
近期将DataGridView常用的一些用法做了一个整理。为防止页面过长,现分批贴出来,此为第十部分。

DataGridView编辑

51. DataGridView编辑中单元格控件取得
52. DataGridView输入自动完成
53. DataGridView单元格编辑时键盘KEY事件取得
54. DataGridView下拉框(ComboBox)单元格编辑时事件取得
55. DataGridView下拉框(ComboBox)单元格允许文字输入设定

51. DataGridView编辑中单元格控件取得

[VB.NET]

'EditingControlShowingイベントハンドラ

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    '表示されているコントロールがDataGridViewTextBoxEditingControlか調べる

    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        '編集のために表示されているコントロールを取得

        Dim tb As DataGridViewTextBoxEditingControl = _

            CType(e.Control, DataGridViewTextBoxEditingControl)

        '次のようにしてもよい

        'Dim tb As TextBox = CType(e.Control, TextBox)

        '列によってIMEのモードを変更する

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            tb.ImeMode = Windows.Forms.ImeMode.Disable

        Else

            tb.ImeMode = dgv.ImeMode

        End If

    End If

End Sub

[C#]

//EditingControlShowingイベントハンドラ

private void DataGridView1_EditingControlShowing(object sender,

    DataGridViewEditingControlShowingEventArgs e)

{

    //表示されているコントロールがDataGridViewTextBoxEditingControlか調べる

    if (e.Control is DataGridViewTextBoxEditingControl)

    {

        DataGridView dgv = (DataGridView)sender;

        //編集のために表示されているコントロールを取得

        DataGridViewTextBoxEditingControl tb =

            (DataGridViewTextBoxEditingControl)e.Control;

        //次のようにしてもよい

        //TextBox tb = (TextBox)e.Control;

        //列によってIMEのモードを変更する

        if (dgv.CurrentCell.OwningColumn.Name == "Column1")

            tb.ImeMode = ImeMode.Disable;

        else

            tb.ImeMode = dgv.ImeMode;

    }

}

其他控件以此类推,比如DataGridViewCheckBoxColumn或者DataGridViewButtonColumn等等。

52. DataGridView输入自动完成

[VB.NET]

Dim autoCompleteSource As New AutoCompleteStringCollection()

'EditingControlShowingイベントハンドラ

Private Sub DataGridView1_EditingControlShowing( _

        ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If TypeOf e.Control Is TextBox Then

        '編集のために表示されているテキストボックスを取得

        Dim tb As TextBox = CType(e.Control, TextBox)

        '該当する列か調べる

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            'オートコンプリートを有効にする

            tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend

            tb.AutoCompleteSource = _

                Windows.Forms.AutoCompleteSource.CustomSource

            tb.AutoCompleteCustomSource = Me.autoCompleteSource

        Else

            'オートコンプリートを無効にする

            tb.AutoCompleteMode = AutoCompleteMode.None

        End If

    End If

End Sub

'DataSourceChangedイベントハンドラ

Private Sub DataGridView1_DataSourceChanged( _

        ByVal sender As Object, ByVal e As EventArgs) _

        Handles DataGridView1.DataSourceChanged

    Dim dgv As DataGridView = CType(sender, DataGridView)

    'オートコンプリートのリストを初期化

    Me.autoCompleteSource.Clear()

    'DataGridView内のデータをリストに追加

    Dim r As DataGridViewRow

    For Each r In dgv.Rows

        'セルの値を取得

        Dim val As String = r.Cells("Column1").Value

        If Not String.IsNullOrEmpty(val) AndAlso _

                Not Me.autoCompleteSource.Contains(val) Then

            'オートコンプリートのリストに追加

            autoCompleteSource.Add(val)

        End If

    Next r

End Sub

'CellValueChangedイベントハンドラ

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellValueChanged

    Dim dgv As DataGridView = CType(sender, DataGridView)

    '該当する列か調べる

    If dgv.Columns(e.ColumnIndex).Name = "Column1" Then

        'セルの値を取得

        Dim val As String = dgv(e.ColumnIndex, e.RowIndex).Value

        If Not String.IsNullOrEmpty(val) AndAlso _

                Not Me.autoCompleteSource.Contains(val) Then

            'オートコンプリートのリストに追加

            autoCompleteSource.Add(val)

        End If

    End If

End Sub

[C#]

AutoCompleteStringCollection autoCompleteSource =

    new AutoCompleteStringCollection();

//EditingControlShowingイベントハンドラ

private void DataGridView1_EditingControlShowing(object sender,

    DataGridViewEditingControlShowingEventArgs e)

{

    DataGridView dgv = (DataGridView)sender;

    if (e.Control is TextBox)

    {

        //編集のために表示されているテキストボックスを取得

        TextBox tb = (TextBox)e.Control;

        //該当する列か調べる

        if (dgv.CurrentCell.OwningColumn.Name == "Column1")

        {

            //オートコンプリートを有効にする

            tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

            tb.AutoCompleteSource = AutoCompleteSource.CustomSource;

            tb.AutoCompleteCustomSource = this.autoCompleteSource;

        }

        else

        {

            //オートコンプリートを無効にする

            tb.AutoCompleteMode = AutoCompleteMode.None;

        }

    }

}

//DataSourceChangedイベントハンドラ

private void DataGridView1_DataSourceChanged(object sender, EventArgs e)

{

    DataGridView dgv = (DataGridView)sender;

    //オートコンプリートのリストを初期化

    this.autoCompleteSource.Clear();

    //DataGridView内のデータをリストに追加

    foreach (DataGridViewRow r in dgv.Rows)

    {

        //セルの値を取得

        string val = r.Cells["Column1"].Value as string;

        if (!string.IsNullOrEmpty(val) &&

            !this.autoCompleteSource.Contains(val))

        {

            //オートコンプリートのリストに追加

            autoCompleteSource.Add(val);

        }

    }

}

//CellValueChangedイベントハンドラ

private void DataGridView1_CellValueChanged(object sender,

    DataGridViewCellEventArgs e)

{

    DataGridView dgv = (DataGridView)sender;

    //該当する列か調べる

    if (dgv.Columns[e.ColumnIndex].Name == "Column1")

    {

        //セルの値を取得

        string val = dgv[e.ColumnIndex, e.RowIndex].Value as string;

        if (!string.IsNullOrEmpty(val) &&

            !this.autoCompleteSource.Contains(val))

        {

            //オートコンプリートのリストに追加

            autoCompleteSource.Add(val);

        }

    }

}

53. DataGridView单元格编辑时键盘KEY事件取得

[VB.NET]

'EditingControlShowingイベントハンドラ

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    '表示されているコントロールがDataGridViewTextBoxEditingControlか調べる

    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        '編集のために表示されているコントロールを取得

        Dim tb As DataGridViewTextBoxEditingControl = _

            CType(e.Control, DataGridViewTextBoxEditingControl)

        'イベントハンドラを削除

        RemoveHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

        '該当する列か調べる

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            'KeyPressイベントハンドラを追加

AddHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

        End If

    End If

End Sub

'DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ

Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _

        ByVal e As KeyPressEventArgs) _

        Handles DataGridView1.KeyPress

    '数字しか入力できないようにする

    If e.KeyChar < "0"c Or e.KeyChar > "9"c Then

        e.Handled = True

    End If

End Sub

[C#]

//EditingControlShowingイベントハンドラ

private void DataGridView1_EditingControlShowing(object sender,

    DataGridViewEditingControlShowingEventArgs e)

{

    //表示されているコントロールがDataGridViewTextBoxEditingControlか調べる

    if (e.Control is DataGridViewTextBoxEditingControl)

    {

        DataGridView dgv = (DataGridView)sender;

        //編集のために表示されているコントロールを取得

        DataGridViewTextBoxEditingControl tb =

            (DataGridViewTextBoxEditingControl)e.Control;

        //イベントハンドラを削除

        tb.KeyPress -=

            new KeyPressEventHandler(dataGridViewTextBox_KeyPress);

        //該当する列か調べる

        if (dgv.CurrentCell.OwningColumn.Name == "Column1")

        {

            //KeyPressイベントハンドラを追加

            tb.KeyPress +=

                new KeyPressEventHandler(dataGridViewTextBox_KeyPress);

        }

    }

}

//DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ

private void dataGridViewTextBox_KeyPress(object sender,

    KeyPressEventArgs e)

{

    //数字しか入力できないようにする

    if (e.KeyChar < '0' || e.KeyChar > '9')

    {

        e.Handled = true;

    }

}

54. DataGridView下拉框(ComboBox)单元格编辑时事件取得

[VB.NET]

Private dataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing

'EditingControlShowingイベントハンドラ

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    '表示されているコントロールがDataGridViewComboBoxEditingControlか調べる

    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        '該当する列か調べる

        If dgv.CurrentCell.OwningColumn.Name = "ComboBox" Then

            '編集のために表示されているコントロールを取得

            Me.dataGridViewComboBox = _

                CType(e.Control, DataGridViewComboBoxEditingControl)

            'SelectedIndexChangedイベントハンドラを追加

            AddHandler Me.dataGridViewComboBox.SelectedIndexChanged, _

                AddressOf dataGridViewComboBox_SelectedIndexChanged

        End If

    End If

End Sub

'CellEndEditイベントハンドラ

Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellEndEdit

    'SelectedIndexChangedイベントハンドラを削除

    If Not (Me.dataGridViewComboBox Is Nothing) Then

        RemoveHandler Me.dataGridViewComboBox.SelectedIndexChanged, _

            AddressOf dataGridViewComboBox_SelectedIndexChanged

        Me.dataGridViewComboBox = Nothing

    End If

End Sub

'DataGridViewに表示されているコンボボックスの

'SelectedIndexChangedイベントハンドラ

Private Sub dataGridViewComboBox_SelectedIndexChanged(ByVal sender As Object, _

        ByVal e As EventArgs)

    '選択されたアイテムを表示

    Dim cb As DataGridViewComboBoxEditingControl = _

        CType(sender, DataGridViewComboBoxEditingControl)

    Console.WriteLine(cb.SelectedItem)

End Sub

[C#]

private DataGridViewComboBoxEditingControl dataGridViewComboBox = null;

//EditingControlShowingイベントハンドラ

private void DataGridView1_EditingControlShowing(object sender,

    DataGridViewEditingControlShowingEventArgs e)

{

    //表示されているコントロールがDataGridViewComboBoxEditingControlか調べる

    if (e.Control is DataGridViewComboBoxEditingControl)

    {

        DataGridView dgv = (DataGridView)sender;

        //該当する列か調べる

        if (dgv.CurrentCell.OwningColumn.Name == "ComboBox")

        {

            //編集のために表示されているコントロールを取得

            this.dataGridViewComboBox =

                (DataGridViewComboBoxEditingControl)e.Control;

            //SelectedIndexChangedイベントハンドラを追加

            this.dataGridViewComboBox.SelectedIndexChanged +=

                new EventHandler(dataGridViewComboBox_SelectedIndexChanged);

        }

    }

}

//CellEndEditイベントハンドラ

private void DataGridView1_CellEndEdit(object sender,

    DataGridViewCellEventArgs e)

{

    //SelectedIndexChangedイベントハンドラを削除

    if (this.dataGridViewComboBox != null)

    {

        this.dataGridViewComboBox.SelectedIndexChanged -=

            new EventHandler(dataGridViewComboBox_SelectedIndexChanged);

        this.dataGridViewComboBox = null;

    }

}

//DataGridViewに表示されているコンボボックスの

//SelectedIndexChangedイベントハンドラ

private void dataGridViewComboBox_SelectedIndexChanged(object sender,

    EventArgs e)

{

    //選択されたアイテムを表示

    DataGridViewComboBoxEditingControl cb =

        (DataGridViewComboBoxEditingControl)sender;

    Console.WriteLine(cb.SelectedItem);

}

55. DataGridView下拉框(ComboBox)单元格允许文字输入设定

[VB.NET]

'EditingControlShowingイベントハンドラ

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then

        '該当する列か調べる

        Dim dgv As DataGridView = CType(sender, DataGridView)

        If dgv.CurrentCell.OwningColumn.Name = "ComboBox" Then

            '編集のために表示されているコントロールを取得

            Dim cb As DataGridViewComboBoxEditingControl = _

                CType(e.Control, DataGridViewComboBoxEditingControl)

            cb.DropDownStyle = ComboBoxStyle.DropDown

        End If

    End If

End Sub

'CellValidatingイベントハンドラ

Private Sub DataGridView1_CellValidating(ByVal sender As Object, _

        ByVal e As DataGridViewCellValidatingEventArgs) _

        Handles DataGridView1.CellValidating

    Dim dgv As DataGridView = CType(sender, DataGridView)

    '該当する列か調べる

    If dgv.Columns(e.ColumnIndex).Name = "ComboBox" AndAlso _

        TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then

        Dim cbc As DataGridViewComboBoxColumn = _

            CType(dgv.Columns(e.ColumnIndex), DataGridViewComboBoxColumn)

        'コンボボックスの項目に追加する

        If Not cbc.Items.Contains(e.FormattedValue) Then

            cbc.Items.Add(e.FormattedValue)

        End If

    End If

End Sub

[C#]

//EditingControlShowingイベントハンドラ

private void DataGridView1_EditingControlShowing(object sender,

    DataGridViewEditingControlShowingEventArgs e)

{

    if (e.Control is DataGridViewComboBoxEditingControl)

    {

        //該当する列か調べる

        DataGridView dgv = (DataGridView)sender;

        if (dgv.CurrentCell.OwningColumn.Name == "ComboBox")

        {

            //編集のために表示されているコントロールを取得

            DataGridViewComboBoxEditingControl cb =

                (DataGridViewComboBoxEditingControl)e.Control;

            cb.DropDownStyle = ComboBoxStyle.DropDown;

        }

    }

}

//CellValidatingイベントハンドラ

private void DataGridView1_CellValidating(object sender,

    DataGridViewCellValidatingEventArgs e)

{

    DataGridView dgv = (DataGridView)sender;

    //該当する列か調べる

    if (dgv.Columns[e.ColumnIndex].Name == "ComboBox" &&

        dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn)

    {

        DataGridViewComboBoxColumn cbc =

            (DataGridViewComboBoxColumn)dgv.Columns[e.ColumnIndex];

        //コンボボックスの項目に追加する

        if (!cbc.Items.Contains(e.FormattedValue))

        {

            cbc.Items.Add(e.FormattedValue);

        }

    }

}

原创粉丝点击