DataGridView控件用法合集(十)
近期将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,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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |