C# 自动完成文本框控件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1357853/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
AutoComplete TextBox Control
提问by mohammad reza
I want to have a textbox control that suggests and append values from a database in a Windows application with C# 2008 and LINQ.
我想要一个文本框控件,它可以在使用 C# 2008 和 LINQ 的 Windows 应用程序中建议和附加来自数据库的值。
I do it with a combobox but I can't do it with a textbox.
我用组合框来做,但我不能用文本框来做。
How do I do it?
我该怎么做?
采纳答案by P.K
This might not be the best way to do things, but should work:
这可能不是最好的做事方式,但应该有效:
this.textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
this.textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
private void textBox1_TextChanged(object sender, EventArgs e)
{
TextBox t = sender as TextBox;
if (t != null)
{
//say you want to do a search when user types 3 or more chars
if (t.Text.Length >= 3)
{
//SuggestStrings will have the logic to return array of strings either from cache/db
string[] arr = SuggestStrings(t.Text);
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(arr);
this.textBox1.AutoCompleteCustomSource = collection;
}
}
}
回答by Michael Todd
You could attach to the KeyDown event and then query the database for that portion of the text that the user has already entered. For example, if the user enters "T", search for things that start with "T". Then, when they enter the next letter, for example "e", search for things in the table that start with "Te".
您可以附加到 KeyDown 事件,然后在数据库中查询用户已经输入的那部分文本。例如,如果用户输入“T”,则搜索以“T”开头的内容。然后,当他们输入下一个字母时,例如“e”,在表中搜索以“Te”开头的内容。
The available items could be displayed in a "floating" ListBox, for example. You would need to place the ListBox just beneath the TextBox so that they can see the entries available, then remove the ListBox when they're done typing.
例如,可用项目可以显示在“浮动”列表框中。您需要将 ListBox 放在 TextBox 的正下方,以便他们可以看到可用的条目,然后在他们完成输入后移除 ListBox。
回答by Thomas Levesque
Check out the AutoCompleteSource
, AutoCompleteCustomSource
and AutoCompleteMode
properties.
查看AutoCompleteSource
,AutoCompleteCustomSource
和AutoCompleteMode
属性。
textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection col = new AutoCompleteStringCollection();
col.Add("Foo");
col.Add("Bar");
textBox1.AutoCompleteCustomSource = col;
Note that the designer allows you to do that without writing any code...
请注意,设计器允许您在不编写任何代码的情况下执行此操作...
回答by Willem Van Onsem
of course it depends on how you implement it but perhaps this is a good start:
当然,这取决于你如何实现它,但也许这是一个好的开始:
using System.Windows.Forms;
public class AutoCompleteTextBox : TextBox {
private string[] database;//put here the strings of the candidates of autocomplete
private bool changingText = false;
protected override void OnTextChanged (EventArgs e) {
if(!changingText && database != null) {
//searching the first candidate
string typed = this.Text.Substring(0,this.SelectionStart);
string candidate = null;
for(int i = 0; i < database.Length; i++)
if(database[i].Substring(0,this.SelectionStart) == typed) {
candidate = database[i].Substring(this.SelectionStart,database[i].Length);
break;
}
if(candidate != null) {
changingText = true;
this.Text = typed+candidate;
this.SelectionStart = typed.Length;
this.SelectionLength = candidate.Length;
}
}
else if(changingText)
changingText = false;
base.OnTextChanged(e);
}
}
I'm not sure this is working very well, but I think the base of this code is good enough.
我不确定这是否工作得很好,但我认为这段代码的基础已经足够好了。
回答by Bathmapriya
private void textBox1_TextChanged(object sender, EventArgs e)
{
try
{
textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection col = new AutoCompleteStringCollection();
con.Open();
sql = "select *from Table_Name;
cmd = new SqlCommand(sql, con);
SqlDataReader sdr = null;
sdr = cmd.ExecuteReader();
while (sdr.Read())
{
col.Add(sdr["Column_Name"].ToString());
}
sdr.Close();
textBox1.AutoCompleteCustomSource = col;
con.Close();
}
catch
{
}
}
回答by Lalit
To AutoComplete TextBox Control in C#.net windows application using
wamp mysql database...
here is my code..
AutoComplete();
write this **AutoComplete();** text in form-load event..
private void Autocomplete()
{
try
{
MySqlConnection cn = new MySqlConnection("server=localhost;
database=databasename;user id=root;password=;charset=utf8;");
cn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT distinct Column_Name
FROM table_Name", cn);
DataSet ds = new DataSet();
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
da.Fill(ds, "table_Name");
AutoCompleteStringCollection col = new
AutoCompleteStringCollection();
int i = 0;
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
col.Add(ds.Tables[0].Rows[i]["Column_Name"].ToString());
}
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
textBox1.AutoCompleteCustomSource = col;
textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
cn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
回答by Aneel Goplani
You can add a parameter in the query like @emailadd to be added in the aspx.cs file where the Stored Procedure is called with cmd.Parameter.AddWithValue.
The trick is that the @emailadd parameter doesn't exist in the table design of the select query, but being added and inserted in the table.
USE [DRDOULATINSTITUTE]
GO
/****** Object: StoredProcedure [dbo].[ReikiInsertRow] Script Date: 5/18/2016 11:12:33 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[ReikiInsertRow]
@Reiki varchar(100),
@emailadd varchar(50)
as
insert into dbo.ReikiPowerDisplay
select Reiki,ReikiDescription, @emailadd from ReikiPower
where Reiki=@Reiki;
Posted By: Aneel Goplani. CIS. 2002. USA
回答by daniele3004
There are two ways to accomplish this textbox effect:
有两种方法可以实现这种文本框效果:
Either using the graphic user interface (GUI); or with code
要么使用图形用户界面(GUI);或者用代码
Using the Graphic User Interface:
Go to: "Properties"Tab; then set the following properties:
使用图形用户界面:
转到:“属性”选项卡;然后设置以下属性:
However; the best way is to create this by code. See example below.
然而; 最好的方法是通过代码创建它。请参阅下面的示例。
AutoCompleteStringCollection sourceName = new AutoCompleteStringCollection();
foreach (string name in listNames)
{
sourceName.Add(name);
}
txtName.AutoCompleteCustomSource = sourceName;
txtName.AutoCompleteMode = AutoCompleteMode.Suggest;
txtName.AutoCompleteSource = AutoCompleteSource.CustomSource;
回答by vega480
private void TurnOnAutocomplete()
{
textBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
string[] arrayOfWowrds = new string[];
try
{
//Read in data Autocomplete list to a string[]
string[] arrayOfWowrds = new string[];
}
catch (Exception err)
{
MessageBox.Show(err.Message, "File Missing", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
collection.AddRange(arrayOFWords);
textBox.AutoCompleteCustomSource = collection;
}
You only need to call this once after you have your data needed for the autocomplete list. Once bound it stays with the textBox. You do not need to or want to call it every time the text is changed in the textBox, that will kill your program.
在您拥有自动完成列表所需的数据后,您只需调用一次。一旦绑定,它就会与文本框保持一致。您不需要或不想在 textBox 中每次更改文本时调用它,这会杀死您的程序。