自定义控件文本框自动完成

时间:2014-01-11 22:27:11

标签: c# winforms autocomplete textbox

美好的一天,

我在文本框上遇到自动填充问题。我有一个自定义控件:

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窗体。任何帮助将不胜感激。

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

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用以下代码:

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