【问题标题】:Textbox Autocomplete in a DataGridView WinformDataGridView Winform 中的文本框自动完成
【发布时间】:2023-04-05 10:52:01
【问题描述】:

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

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;

            }
        }
    }

【问题讨论】:

    标签: c# .net winforms datagridview


    【解决方案1】:

    尝试释放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;
    }
    

    【讨论】:

    • prodCode 超出范围请修复它
    【解决方案2】:

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

    您想让所有列都可编辑吗?还是当前选定行中的一个单元格?表单上的另一个按钮如何触发编辑?在这种情况下,当编辑变为活动状态时,可以选择任何单元格吗?

    您需要索引到正确的列并将其设置为启用自动完成功能。

    【讨论】:

    • 是的,使用自动完成功能使整个第三列可编辑。据我了解上面的代码......每当在datagridview中编辑单元格时,都会触发编辑控件显示。然后我检查以确保只有第三列收到自动完成。
    • 不,你检查一下用户当前点击了第三列数据网格中的一个单元格。
    • 好的,解决了。感谢您为我指明正确的方向。今天晚些时候我会在下面发布我的解决方案。
    • 这正是我今天想做的事情。如果你的解决方案被发布了那就太好了,但我会干燥并调试上面的内容。
    【解决方案3】:

    Abuleen的建议是最好的!我对它做了一点改进,因为 else 语句中的行会抛出 Variable 在当前上下文中不存在

    类型的 error

    因此来自他的代码:

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

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多