2009年7月27日 星期一

DataGridView中被表示的TextBox的AutoComplete有效


DataGridView中被表示的TextBox的AutoComplete有效


注意:DataGridView控件是從.NET Framework 2.0版本開始追加的。
在DataGridView中被表示TextBox的AutoComplete有效的方法,如果對「取得在DataGridView中表示的TextBox」中所介紹的方法理解的話,就相當簡單。就是對取得的TextBox的AutoCompleteMode屬性進行變更即可。
下面的例子是文字型的"Column1"列中表示的TextBox增加AutoComplete的代碼。
[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
 '取得了被表示的TextBox
Dim tb As TextBox = CType(e.Control, TextBox)
 '檢測對應列
 If dgv.CurrentCell.OwningColumn.Name = "Column1" Then
 'AutoComplete有效
tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend
tb.AutoCompleteSource = _
Windows.Forms.AutoCompleteSource.CustomSource
tb.AutoCompleteCustomSource = Me.autoCompleteSource
Else
 'AutoComplete無效
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)
 'AutoComplete的List初始化
 Me.autoCompleteSource.Clear()
 '向List追加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
 '向AutoComplete的List追加
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
 '向AutoComplete的List追加
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
TextBox tb = (TextBox)e.Control;
  //檢測對應列
 if (dgv.CurrentCell.OwningColumn.Name == "Column1")
{
  // AutoComplete有效
tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
tb.AutoCompleteCustomSource = this.autoCompleteSource;
}
else
{
 // AutoComplete無效
tb.AutoCompleteMode = AutoCompleteMode.None;
}
}
}

 //DataSourceChanged事件處理器
 private void DataGridView1_DataSourceChanged(object sender, EventArgs e)
{
DataGridView dgv = (DataGridView)sender;
 // AutoComplete的List初始化
 this.autoCompleteSource.Clear();
  //向List追加DataGridView內的數據
 foreach (DataGridViewRow r in dgv.Rows)
{
  //取得單元格的值
 string val = r.Cells["Column1"].Value as string;
 if (!string.IsNullOrEmpty(val) &&
!this.autoCompleteSource.Contains(val))
{
  //向AutoComplete的List追加
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))
{
 //向AutoComplete的List追加
autoCompleteSource.Add(val);
}
}
}

沒有留言:

張貼留言