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,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);
}
}
}