c# combobox的模糊查询
数据是从数据库里得到的,
比方说当输入 河 字时,
combobox下拉菜单中会自动显示河南,河北等
建议下思路,谢谢了。
[解决办法]
直接模糊查询数据不就得了,然后绑定到下拉列表
[解决办法]
思路
在Combobox的TextChanged里面处理 1楼说的 ,
[解决办法]
我说下我的想法
数据:地名表里,有河南,河北字段的同时,增加一个便于索引的字段(河、河)
事件:KeyUp
[PublishEvent("OnSearch")] public event EventHandler<DataEventArgs<string>> OnSearchEvent; private void txtSearch_KeyUp(object sender, KeyEventArgs e) { if (OnSearchEvent != null) { // Raise the event and notify the controller OnSearchEvent(this, new DataEventArgs<string>(txtSearch.Text)); } } // Search event from the view private void OnSearch(object sender, DataEventArgs<string> e) { // 1、更新数据集合代码 // 2、更新界面 }
[解决办法]
this.comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
this.comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
[解决办法]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Combobox_实现数据库模糊查询动态绑定
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static string SqlConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\C#项目文件\Database\MyPersonnel.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection conn = new SqlConnection(SqlConnectionString);
bool isover = false;
private void comboBox1_TextChanged(object sender, EventArgs e)
{
if (!isover)
{
string comboboxtext = this.comboBox1.Text.Trim();
string str = "SELECT 省份 FROM 省份信息 WHERE 省份 LIKE " + "'" + this.comboBox1.Text.Trim() + "%'";
SqlCommand comm = new SqlCommand(str, conn);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
List<string> shengfen = new List<string>();
foreach (DataRow row in ds.Tables[0].Rows)
{
foreach (DataColumn column in ds.Tables[0].Columns)
{
shengfen.Add(row[column].ToString());
}
}
int index=0;
for (int i = 0; i < shengfen.Count; i++)
{
if (shengfen[i] == comboboxtext)
{
index = i;
isover = true;
}
}
this.comboBox1.DataSource = shengfen;
this.comboBox1.SelectedIndex = index ;
this.comboBox1.DropDownStyle = ComboBoxStyle.DropDown;
}
else
{
}
}
}
}
可能还有些小问题,自己改下.
------解决方案--------------------
private void cmbJT_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Func.SearchFirstLetter("表名", "字段名", "显示的字段名", "where 地方='河南'", cmbJT);
}
}
--------------------------------------------------------------------
public static Control sourceControl;
public static DataGridView dgv = new DataGridView();
/// <summary>
/// 首拼搜索
/// </summary>
/// <param name="tablename">表名</param>
/// <param name="col">字段名</param>
/// <param name="showcol">显示的字段名</param>
/// <param name="where">条件</param>
/// <param name="source">绑定的控件</param>
public static void SearchFirstLetter(string tablename, string col, string showcol, string where, Control source)
{
string sql = "";
sql += "select " + col + " as '" + showcol + "' from " + tablename + " " + where;
DataSet ds = new DataSet();
ds = ProcessDataBase.DBbind(sql);
if (ds == null || ds.Tables[0].Rows.Count <= 0)
{
Msg("没有找到记录!");
return;
}
sourceControl = source;
if (dgv.Visible)
{
dgv.Hide();
}
for (int i = ds.Tables[0].Rows.Count - 1; i >= 0; i--)
{
if (Func.GetFirstLetter(ds.Tables[0].Rows[i][0].ToString()).ToLower().Trim().Contains(source.Text.ToLower().Trim()) == false)
{
ds.Tables[0].Rows.Remove(ds.Tables[0].Rows[i]);
}
}
dgv.DataSource = ds;
dgv.DataMember = ds.Tables[0].TableName;
dgv.AutoGenerateColumns = true;
dgv.AllowUserToAddRows = false;
dgv.ReadOnly = true;
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgv.DoubleClick += new EventHandler(dgv_DoubleClick);
dgv.KeyDown += new KeyEventHandler(dgv_KeyDown);
source.FindForm().Controls.Add(dgv);
Control tmpcon = source;
int tmpleft = source.Left;
int tmptop = source.Top;
while (true)
{
tmpcon = tmpcon.Parent;
if (tmpcon != (Control)tmpcon.FindForm())
{
tmpleft += tmpcon.Left;
tmptop += tmpcon.Top;
}
else
{
break;
}
}
dgv.Left = tmpleft;
dgv.Top = tmptop + source.Height;
dgv.Width = source.Width;
dgv.Height = 200;
dgv.BringToFront();
dgv.Show();
dgv.Focus();
}
static void dgv_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
sourceControl.Text = dgv[0, dgv.CurrentRow.Index].Value.ToString();
((DataGridView)sender).Hide();
sourceControl.Focus();
}
else if (e.KeyCode == Keys.Escape)
{
((DataGridView)sender).Hide();
sourceControl.Focus();
}
}
catch
{
((DataGridView)sender).Hide();
sourceControl.Focus();
}
}
static void dgv_DoubleClick(object sender, EventArgs e)
{
try
{
if (sourceControl != null)
{
sourceControl.Text = dgv[0, dgv.CurrentRow.Index].Value.ToString();
dgv.Hide();
sourceControl.Focus();
}
}
catch
{ }
}
/// <summary>
/// 得到ASCII码
/// </summary>
/// <param name="chr"></param>
/// <returns></returns>
public static int Ascii(char chr)
{
System.Text.Encoding ecode = System.Text.Encoding.GetEncoding("GB18030");
Byte[] codeBytes = ecode.GetBytes(chr.ToString().Trim());
if (codeBytes.Length == 2)
{
return (int)codeBytes[0] * 256 + (int)codeBytes[1] - 65536;
}
else
{
return (int)codeBytes[0];
}
}
/// <summary>
/// 得到首拼
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetFirstLetter(string str)
{
char t1;
string val = "";
for (int i = 0; i < str.Trim().Length; i++)
{
t1 = Convert.ToChar(str.Trim().Substring(i, 1));
if (Ascii(t1) >= Ascii('!') && Ascii(t1) <= Ascii('~'))
val += t1;
else if (Ascii(t1) >= Ascii('啊') && Ascii(t1) < Ascii('芭'))
val += "A";
else if (Ascii(t1) >= Ascii('芭') && Ascii(t1) < Ascii('擦'))
val += "B";
else if (Ascii(t1) >= Ascii('擦') && Ascii(t1) < Ascii('搭'))
val += "C";
else if (Ascii(t1) >= Ascii('搭') && Ascii(t1) < Ascii('蛾'))
val += "D";
else if (Ascii(t1) >= Ascii('蛾') && Ascii(t1) < Ascii('发'))
val += "E";
else if (Ascii(t1) >= Ascii('发') && Ascii(t1) < Ascii('噶'))
val += "F";
else if (Ascii(t1) >= Ascii('噶') && Ascii(t1) < Ascii('哈'))
val += "G";
else if (Ascii(t1) >= Ascii('哈') && Ascii(t1) < Ascii('击'))
val += "H";
else if (Ascii(t1) >= Ascii('击') && Ascii(t1) < Ascii('喀'))
val += "J";
else if (Ascii(t1) >= Ascii('喀') && Ascii(t1) < Ascii('拉'))
val += "K";
else if (Ascii(t1) >= Ascii('拉') && Ascii(t1) < Ascii('妈'))
val += "L";
else if (Ascii(t1) >= Ascii('妈') && Ascii(t1) < Ascii('拿'))
val += "M";
else if (Ascii(t1) >= Ascii('拿') && Ascii(t1) < Ascii('哦'))
val += "N";
else if (Ascii(t1) >= Ascii('哦') && Ascii(t1) < Ascii('啪'))
val += "O";
else if (Ascii(t1) >= Ascii('啪') && Ascii(t1) < Ascii('期'))
val += "P";
else if (Ascii(t1) >= Ascii('期') && Ascii(t1) < Ascii('然'))
val += "Q";
else if (Ascii(t1) >= Ascii('然') && Ascii(t1) < Ascii('撒'))
val += "R";
else if (Ascii(t1) >= Ascii('撒') && Ascii(t1) < Ascii('塌'))
val += "S";
else if (Ascii(t1) >= Ascii('塌') && Ascii(t1) < Ascii('挖'))
val += "T";
else if (Ascii(t1) >= Ascii('挖') && Ascii(t1) < Ascii('昔'))
val += "W";
else if (Ascii(t1) >= Ascii('昔') && Ascii(t1) < Ascii('压'))
val += "X";
else if (Ascii(t1) >= Ascii('压') && Ascii(t1) < Ascii('匝'))
val += "Y";
else if (Ascii(t1) >= Ascii('匝'))
val += "Z";
else
val += "-";
}
return val;
}