最初に、私は全体を検索し、同じ問題を見つけましたが、あまり好きではなかった非常に異なる答えを見つけました。明確にするために、私は TextBox を再構築したくありません。というわけでここで撮影。
AutoCompleteMode.Suggest のようなコンボボックスが必要であるが、「で始まる」検索ではなく「含む」検索であるというこの問題が発生しています。これは、検索が含まれていることを除いて、これまでのところ私のコードです。
string displayMember = "Kund";
string sqlString = "select Kund from [Blad1$] order by Kund";
con.Open();
DataRow dataRow = table.NewRow();
dataRow[displayMember] = "";
table.Rows.InsertAt(dataRow, 0);
cB1.DataSource = table;
cB1.DisplayMember = displayMember;
cB1.SelectedIndex = 0;
cB1.Text = "";
OleDbCommand cmd = new OleDbCommand(sqlString, con);
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read()) namesCollection.Add(dr[displayMember].ToString());
dr.Close();
con.Close();
cB1.AutoCompleteMode = AutoCompleteMode.Suggest;
cB1.AutoCompleteSource = AutoCompleteSource.CustomSource;
cB1.AutoCompleteCustomSource = namesCollection;
しかし、ここでは、ドロップダウンで提案することで検索に含まれるジョブを実行するコードがありますが、入力ボックスの現在の文字に一番上の項目を追加します。たとえば、「p」と入力すると、「Harry Potter」が表示され、「pHarry Potter」のように表示されます。また、1文字しか入力できません。
//join previous text and new pressed char
string name = string.Format("{0}{1}", cB1.Text, e.KeyChar.ToString());
DataRow[] rows = table.Select(string.Format("Kund LIKE '%{0}%'", name));
DataTable filteredTable = AllNames.Clone();
foreach (DataRow r in rows) filteredTable.ImportRow(r);
cB1.DataSource = null;
cB1.DataSource = filteredTable.DefaultView;
cB1.DisplayMember = "Kund";
cB1.DroppedDown = true;
これら 2 つのコードを何らかの方法で組み合わせることができれば、私はとても近いと感じます。 編集:私はいくつかの進歩を遂げました。まだ満足のいくものではありませんが、正しい方向に進んでいます。それでも、テキストボックスを使用して入力したくありません。この方法を使用するのは難しいです。
private void Form1_Load(object sender, EventArgs e)
{
con = new OleDbConnection(@"some file.xls");
da = new OleDbDataAdapter("SELECT Kund FROM [Blad1$] ORDER BY Kund", con);
da.Fill(AllNames);
table = AllNames.Copy();
DataRow dataRow = table.NewRow();
dataRow["Kund"] = "";
table.Rows.InsertAt(dataRow, 0);
tempTable();
}
public void tempTable()
{
try
{
DataRow[] rows = table.Select("Kund LIKE '%" + textBox1.Text + "%' OR Kund LIKE ''");
DataTable filteredTable = AllNames.Clone();
foreach (DataRow r in rows) filteredTable.ImportRow(r);
cB1.DataSource = null;
cB1.DataSource = filteredTable.DefaultView;
cB1.DisplayMember = "Kund";
cB1.SelectedIndex = 0;
}
catch (Exception x)
{
MessageBox.Show(x.Message);
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
tempTable();
cB1.DroppedDown = true;
私を助けてください。