【问题标题】:textbox auto complete (Multi Line)文本框自动完成(多行)
【发布时间】:2012-10-09 23:31:29
【问题描述】:

我在 C# 中创建一个自动建议/完整文本框,我点击下面的链接,但文本框没有显示建议

How to create autosuggest textbox in windows forms?

//-------- Get all distinct description -----------------------------
OleDbCommand command = new OleDbCommand(Queries.qry16, Connection);
OleDbDataReader reader = command.ExecuteReader();

//--------- Storing ------------------------------------
while (reader.Read())
{
    namesCollection.Add(reader.GetValue(0).ToString());
}

//----------- Close after use ---------------------------------------
reader.Close();

//----------- Set the auto suggestion in description box ------------
descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
descriptionBox.AutoCompleteCustomSource = namesCollection;

这是我的代码,它在 winform 的加载函数中。 nameCollection 初始化在构造函数中...请帮助使其正常工作。

我正在编辑我的帖子而不是创建新帖子...我已经在单行文本框中尝试了我自己的代码并且它有效。现在我想在多行中使用相同的内容...对于研究,我在 Google 上搜索了 2 天以上,尝试了不同的代码(一个具有智能感知的代码),但它不能作为文本框中的自动建议。谁能给我建议将整个过程编码为多行..谢谢。

【问题讨论】:

  • 当您将namesCollection 指定为数据源时,您确定它实际上包含任何条目吗?
  • 私有 AutoCompleteStringCollection namesCollection;这就是我用来收集名字的东西
  • 其实我发现了问题,文本框是多行而不是单行

标签: c# winforms autocomplete


【解决方案1】:

AutoCompleteSource does not work on multiline TextBox controls.

这意味着你需要从头开始:

我会制作一个 ListBox 来显示您的自动完成内容:

var listBox = new ListBox();
Controls.Add(listBox);

你需要在你的文本框上进行事件处理,但这有点粗糙,所以我会重写它以在某个时候停止 keyupevent:

private void textBox_KeyUp(object sender, KeyEventArgs e)
{
    var x = textBox.Left;
    var y = textBox.Top + textBox.Height;
    var width = textBox.Width + 20;
    const int height = 40;

    listBox.SetBounds(x, y, width, height );
    listBox.KeyDown += listBox_SelectedIndexChanged;

    List<string> localList = list.Where(z => z.StartsWith(textBox.Text)).ToList();
    if(localList.Any() && !string.IsNullOrEmpty(textBox.Text))
    {
        listBox.DataSource = localList;
        listBox.Show();
        listBox.Focus();

    }
}

现在您只需要一个处理程序来设置文本框中的文本:

 void listBox_SelectedIndexChanged(object sender, KeyEventArgs e)
    {
        if(e.KeyValue == (decimal) Keys.Enter)
        {
            textBox2.Text = ((ListBox)sender).SelectedItem.ToString();
            listBox.Hide();                
        }
    }

在适当的地方进行空检查

【讨论】:

  • 忘了提到这里的列表是您的自定义自动完成源。在这种情况下,它只是一个 List.
  • 谢谢,由于我的帐户被暂停,我无法对所有答案表示感谢。
  • list 和 textBox2 未定义
  • 我将“var”添加到列表的初始化中。至于 textBox2,这是 winforms,所以它驻留在另一个文件中,这似乎是多余的,并且已经 4 年没有错过了。
【解决方案2】:

您需要通过“添加新项目”来添加一个新组件类。然后为该类编写代码,然后在需要的地方添加该组件..

【讨论】:

    【解决方案3】:

    试试这个代码,因为它适用于我的情况:

      AutoCompleteStringCollection MyCollection = new AutoCompleteStringCollection();
                    while (reader.Read())
                    {
                        namesCollection.Add(reader.GetString(0));
                    }
                    reader.Close();
        descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
    descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;    
                    descriptionBox.AutoCompleteCustomSource = namesCollection;
                    con.Close();
    

    请检查读者是否获得了所需的记录..:)

    【讨论】:

    • 实际上我的代码在我将其更改为单行后工作......我仍然想知道如何将其用于多行
    • @GreatMajestics:阅读此链接..希望这能解决您的好奇心。:=) codeproject.com/Articles/5839/DIY-Intellisense
    • 我已经检查了以下链接。在我的编辑中也提到了。但不知道如何实现我自己的建议文本框。
    【解决方案4】:

    “自动建议”有点混乱,因为它基本上是自动完成的,没有用户“完成”文本的许可。不过,这里有几个链接可能会对您有所帮助:

    http://docs.jquery.com/UI/Autocomplete

    Autocomplete functionality on a textarea

    AutoComplete extender for multi-line Textbox

    在链接 #2 上向下滚动,用户建议使用 jquery 解决方案并与链接 #1 进行比较。您可能会找到解决方案。

    第三个链接来自asp论坛,与您类似的问题也由链接回答。您可能想检查一下。

    【讨论】:

      【解决方案5】:

      这可以帮助您解决问题; 您可以更改表名。您可以更改查询以加载列表框。

          ListBox lbox;
          private void IletisimBilgileriDoldur()
          {
              try
              {
                  string strQuery= "Select adres From tblIletisimBilgileri Where adres <> '';";
                  veri = new OleDbCommand(strQuery,strConn);
                  veri.CommandType = CommandType.Text;
                  if (strConn.State == ConnectionState.Closed) strConn.Open();
                  oku = veri.ExecuteReader();
                  DataTable dt = new DataTable();
                  dt.Load(oku);
                  oku.Close();
                  txtAdres.AutoCompleteCustomSource.Clear();
                  if (dt.Rows.Count >= 0)
                  {
                      lbox = new ListBox();
                      for (int count = 0; count < dt.Rows.Count; count++)
                      {
                          lbox.Items.Add(dt.Rows[count]["adres"].ToString());
                      }
                  }
                  txtAdres.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                  txtAdres.AutoCompleteSource = AutoCompleteSource.CustomSource;
                  if (strConn.State == ConnectionState.Open) strConn.Close();
              }
              catch (Exception)
              {
                  if (strConn.State == ConnectionState.Open) strConn.Close();
              }
          }
      
          private void txtAdres_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
          {
              var x = txtAdres.Left;
              var y = txtAdres.Top + txtAdres.Height;
              var width = txtAdres.Width;
              const int height = 120;
      
              lbox.SetBounds(x, y, width, height);
              lbox.KeyDown += lbox_SelectedIndexChanged;
              lbox.DoubleClick += lbox_DoubleClick;
              gbxAdres.Controls.Add(lbox);
              lbox.BringToFront();
              lbox.Show();
              ActiveControl = txtAdres;
          }
      
          void lbox_DoubleClick(object sender, EventArgs e)
          {
              txtAdres.Text = ((ListBox)sender).SelectedItem.ToString();
              lbox.Hide();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-15
        • 2013-06-29
        • 2012-09-30
        • 2011-04-18
        • 2010-09-22
        • 1970-01-01
        相关资源
        最近更新 更多