2011-08-29 51 views
1

我已经将我的DataGridView绑定正确地绑定到了我的数据表中,但是我试图让自动完成功能为其中一个文本框列正常工作。自动完成正在工作,但我试图将其限制在datagridview上只有一列。目前它要么为每一列都做,要么根本没有。有任何想法吗?下面的代码。在DataGridView Winform中的文本框自动完成

private void dataGridDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     if (dataGridDetail.CurrentCell.ColumnIndex == 2) 
     { 
      var source = new AutoCompleteStringCollection(); 
      String[] stringArray = Array.ConvertAll<DataRow, String>(products.Select(), delegate(DataRow row) { return (String)row["code"]; }); 
      source.AddRange(stringArray); 

      TextBox prodCode = e.Control as TextBox; 
      if (prodCode != null) 
      { 
       prodCode.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
       prodCode.AutoCompleteCustomSource = source; 
       prodCode.AutoCompleteSource = AutoCompleteSource.CustomSource; 

      } 
     } 
    } 

回答

2

您的if条件只是检查用户当前是否选择了第三列。

是否要使所有栏可编辑?或者只是当前选定行中的一个单元格?编辑如何通过表单上的另一个按钮触发?在这种情况下,当编辑变为活动状态时,可以选择任何单元格?

您需要索引到正确的列并将其设置为启用自动填充。

+0

是,通过自动完成使整个第三列可编辑。据我了解上面的代码...每当一个单元格正在编辑datagridview触发编辑控件显示。然后我检查确保只有第三列收到自动完成。 – user526549

+0

不,您检查用户是否已经点击第三列数据网格中的单元格。 – kmcc049

+1

好吧解决了它。感谢您指点我正确的方向。我会在今天晚些时候发布我的解决方案。 – user526549

5

尝试释放prodCode.AutoCompleteCustomSource,如果没有正确的列:

private void dataGridDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (dataGridDetail.CurrentCell.ColumnIndex == 2) 
    { 
     var source = new AutoCompleteStringCollection(); 
     String[] stringArray = Array.ConvertAll<DataRow, String>(products.Select(), delegate(DataRow row) { return (String)row["code"]; }); 
     source.AddRange(stringArray); 

     TextBox prodCode = e.Control as TextBox; 
     if (prodCode != null) 
     { 
      prodCode.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
      prodCode.AutoCompleteCustomSource = source; 
      prodCode.AutoCompleteSource = AutoCompleteSource.CustomSource; 

     } 
    }else 
      prodCode.AutoCompleteCustomSource = null; 
} 
+0

prodCode超出范围请修复它 – Hisham

0

Abuleen的建议是最好的!我做只是有点改善,因为else语句行会抛出类型的错误变量不会在目前的情况下,从他的代码存在

因此:

private void dataGridDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if(dataGridDetail.EditingControl.GetType()==typeof(DataGridViewTextBoxEditingControl)) 
    {  
     TextBox prodCode = e.Control as TextBox;   
     if (dataGridDetail.CurrentCell.ColumnIndex == 2) 
     {       
     var source = new AutoCompleteStringCollection(); 
     String[] stringArray = Array.ConvertAll<DataRow, String>(products.Select(), delegate(DataRow row) { return (String)row["code"]; }); 
     source.AddRange(stringArray); 

     TextBox prodCode = e.Control as TextBox; 
     if (prodCode != null) 
     { 
      prodCode.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
      prodCode.AutoCompleteCustomSource = source; 
      prodCode.AutoCompleteSource = AutoCompleteSource.CustomSource; 

     } 
     } 
     else { prodCode.AutoCompleteCustomSource = null; } 
    } 
}