【问题标题】:Custom Control Textbox Autocomplete自定义控件文本框自动完成
【发布时间】:2014-01-11 22:27:11
【问题描述】:

早安,

我对文本框的自动完成有疑问。我有一个自定义控件:

public partial class CustomTextBox : UserControl

然后在这个控件中添加一个文本框:

public CustomTextBox()
    {
        InitializeComponent();

        TextBox textBox = new TextBox();

        textBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        textBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
        textBox.AutoCompleteCustomSource = aclist;

        textBox.Multiline = false;

        textBox.BorderStyle = BorderStyle.None;

        this.Controls.Add(textBox);

    }

现在,如果我在表单中添加文本框并将 AutoCompleteStringCollection 设置为我用于自定义自动完成列表的控件属性,则文本框的自动完成在运行时将不起作用。

但是,如果我在创建控件的同一个地方添加一个测试 AutoCompleteStringCollection,它就可以工作:

public CustomTextBox()
    {
        InitializeComponent();

        TextBox textBox = new TextBox();

        textBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        textBox.AutoCompleteSource = AutoCompleteSource.CustomSource;

        AutoCompleteStringCollection list = new AutoCompleteStringCollection();
        list.Add("Test");

        textBox.AutoCompleteCustomSource = list;

        textBox.Multiline = false;

        textBox.BorderStyle = BorderStyle.None;

        this.Controls.Add(textBox);

    }

不确定我是否遗漏了什么。如果您需要更多代码来帮助回答问题,请告诉我。

我正在使用 Windows 窗体。任何帮助将不胜感激。

PS 我不从 TextBox 继承的原因是因为我无法在不更改字体大小或将其更改为多行文本框的情况下更改文本框高度。

谢谢

【问题讨论】:

    标签: c# winforms autocomplete textbox


    【解决方案1】:

    所以如果有人好奇的话,我就会发现问题所在。在自定义文本框中分配 autocompletecustomsource 的位置,如果我将其从公共 CustomTextBox() { ... } 中取出并将其放入,例如我绘制控件的方法,它会完美运行。在 InitializeComponent() 下,列表仍然显示为空,但仅在paint方法中才为其分配了值

    【讨论】:

      【解决方案2】:

      您可以使用以下代码:

      MyCollection(TextBox, "ColumnName", "TableName");
      
      public static AutoCompleteStringCollection MyCollection(TextBox txt, string ColumnName, string TableName)
      {
      using (SqlConnection CON = new SqlConnection("ConnectionString"))
              {
                  SqlCommand CMD = new SqlCommand("SELECT DISTINCT " + ColumnName + " FROM " + TableName + "", CON);
                  CON.Open();
                  SqlDataReader Reader = CMD.ExecuteReader();
                  AutoCompleteStringCollection MyCollection = new AutoCompleteStringCollection();
                  while (Reader.Read())
                  {
                      MyCollection.Add(Reader.GetString(0)).ToString();
                  }
                  CON.Close();
                  return txt.AutoCompleteCustomSource = MyCollection;
              }
          }
      

      【讨论】:

      • ...他为什么要连接SQL?
      猜你喜欢
      • 2017-09-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多