读书人

C# ComboBox DroppedDown属性存在的有

发布时间: 2012-11-09 10:18:48 作者: rapoo

C# ComboBox DroppedDown属性存在的问题
各位大大们有何良策,描述如下:

功能描述:初始化将数据赋值ComboBox,通过输入值再查询数据库,功能类似于google搜索功能
例如:初始化ComboBox显示的是Content下的5条内容
当输入字母as的时候,联合SeqNo与Content,
as->张三,as->李四,同时搜索Content里面模糊匹配as的,即as11,as22,一共四条数据

直接绑定的话,数据动态变化会报"内存破坏"的信息,所以这里就没有绑定了

存在的问题: 1.当输入关键字时,输入的顺序是反序的

2.鼠标指针被窗体掩盖

3.输入关键字后,下拉框自动弹出时点内容需点击两次

4.下拉列表出来后,不能使用键盘上下键进行选择
解决了问题一和二,第三个和第四问题待解决


数据库

表1: ItemNo SeqNo Content
5 as1 张三
5 as2 李四
5 33 as11
5 55 as22
5 丁 ad33
sql:
初始化查询:
SELECT ItemInfoNo,Content,SeqNo From SickItemInfo Where ItemNo=5 Order by ItemInfoNo
ComboBox 输入模糊查询:queryCondition即为输入的模糊字段
SELECT ItemInfoNo,Content,SeqNo From SickItemInfo Where ItemNo=5 " + " And (Content like '" + queryCondition + "%' Or SeqNo like '" + queryCondition + "%') Order by ItemInfoNo";

测试代码:

C# code
 
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.TextChanged -= new System.EventHandler(this.comboBox1_TextChanged);

DataSet dataSet = GetUriResultInfo();//即初始化查询
for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
this.comboBox1.Items.Add(dataSet.Tables[0].Rows[i]["Content"]);
}
this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged);
}

private void comboBox1_TextChanged(object sender, EventArgs e)
{
try
{
this.comboBox1.TextChanged -= new System.EventHandler(this.comboBox1_TextChanged);
comboBox1.Items.Clear();
string text = this.comboBox1.Text;
DataSet dataSet = GetUriResultInfo(text);

//if (this.comboBox1.Text != "" && this.comboBox1.Text != " ")
//{
// comboBox1.DataSource = null;
//}
//comboBox1.DataSource = dataSet.Tables[0];
//comboBox1.DisplayMember = "Content";
//comboBox1.ValueMember = "SeqNo";
//comboBox1.SelectedIndex = -1;

for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
this.comboBox1.Items.Add(dataSet.Tables[0].Rows[i]["Content"]);


}

comboBox1.DroppedDown = true;
comboBox1.Text = text;
comboBox1.SelectionStart = comboBox1.Text.Length;
//显示鼠标指针
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.IBeam;
//保持鼠标指针形状
Cursor = System.Windows.Forms.Cursors.Default;
this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally { }
}






[解决办法]
http://download.csdn.net/source/985752

http://www.codeproject.com/KB/combobox/DotNetMultiColumnComboBox.aspx


[解决办法]
C# code
        private DataTable GetData(string strSQl)        {            DataTable dtData = new DataTable();            using (SqlConnection thisConnection = new SqlConnection(               @"Data Source=.;Initial Catalog=PatrolDataBase;Integrated Security=True"))            {                using (SqlDataAdapter thisAdapter = new SqlDataAdapter(                    strSQl, thisConnection))                {                    thisAdapter.Fill(dtData);                }                thisConnection.Close();            }            return dtData;        }        BindingSource bind = new BindingSource();        string str1 = "select SeqNo from TestTable union all select Content from TestTable";        private void Form1_Load(object sender, EventArgs e)        {            comboBox1.DisplayMember = "SeqNo";            comboBox1.DataSource = GetData(str1);            comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;            comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;        }
[解决办法]
探讨
查过相关的帖子
将属性AutoCompleteMode = suggest;
    AutoCompleteSource = ListItems;
可能只适用于静态的绑定ComboBox,因为输入模糊字符是要重新查询数据库的
尝试了每查询一次,都重新绑定ComboBox,结果老是报内存保护等错误,可能不能动态查询

[解决办法]
SQL code
CREATE TABLE [dbo].[TestTable] (    [ItemNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,    [SeqNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,    [Content] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]GOinsert into TestTable select '5', 'as1', '张三' union all select '5', 'as2', '李四' union all select '5', '33', 'as11' union all select '5', '55', 'as22' union all select '5', '丁', 'ad33'select SeqNo from TestTable union all select Content from TestTable
[解决办法]
很长.眼睛有点胀
[解决办法]
直接绑定的话,数据动态变化会报"内存破坏"的信息,所以这里就没有绑定了???


WHY????


重新 搜索数据回来后,把 下拉的 把 DT重新赋值给 下拉,再 DataBind() 一次!

读书人网 >C#

热点推荐