亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WinForm 自動完成控件實例代碼簡析

2020-01-24 03:36:38
字體:
來源:轉載
供稿:網友
在Web的應用方面有js的插件實現自動完成(或叫智能提示)功能,但在WinForm窗體應用方面就沒那么好了。

TextBox控件本身是提供了一個自動提示功能,只要用上這三個屬性:
AutoCompleteCustomSource:AutoCompleteSource 屬性設置為CustomSource 時要使用的 StringCollection。
AutoCompleteMode:指示文本框的文本完成行為。
AutoCompleteSource:自動完成源,可以是 AutoCompleteSource 的枚舉值之一。

就行了, 一個簡單的示例如下
復制代碼 代碼如下:

textBox1.AutoCompleteCustomSource .AddRange(new string[] { "java","javascript","js","c#","c","c++" });
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

可是這種方式的不支持我們中文的簡拼自動完成(如在文本框里輸入"gz"就會出現"廣州")。只好自己寫一個支持簡拼自動完成的控件了。
這是效果圖
 
控件不太復雜,一個TextBox和一個ListBox。代碼方面,用DataTable作數據源,每次在TextBox的值時,通過DataTable的Select方法,配上合適的表達式(如:{0} like '{1}%' and IsNull([{2}], ' ') <> ' ')來篩選出合適的備選文本內容,以下則是控件的代碼:
復制代碼 代碼如下:

private TextBox _tb;
private ListBox _lb;
private DataTable _dt_datasource;
private bool _text_lock;
private string _general_text;//原始輸入文本框的值
private bool _lb_kd_first_top;//listbox是否第一次到達頂部
private int _itemCount;

復制代碼 代碼如下:

/// <summary>
/// TextBox的Text屬性,增加了_text_lock操作,放置觸發TextChanged事件
/// </summary>
private string TextBoxText
{
get { return _tb.Text; }
set
{
_text_lock = true;
_tb.Text = value;
_text_lock = false;
}
}
/// <summary>
/// 顯示在ListBox的字段名
/// </summary>
public string ValueName { get; set; }
/// <summary>
/// 用于匹配的字段名
/// </summary>
public string CodeName { get; set; }
/// <summary>
/// 顯示提示項的數量
/// </summary>
public int ItemCount
{
get
{ return _itemCount; }
set
{
if (value <= 0)
_itemCount = 1;
else
_itemCount = value;
}
}
public DataTable DataSource
{
get { return _dt_datasource; }
set { _dt_datasource = value; }
}

復制代碼 代碼如下:
 
public AutoComplete() 

InitialControls(); 
}

復制代碼 代碼如下:

void AutoComplete_Load(object sender, EventArgs e)
{
_tb.Width = this.Width;
_lb.Width = _tb.Width;
this.Height = _tb.Height-1;
}
void AutoComplete_LostFocus(object sender, EventArgs e)
{
_lb.Visible = false;
this.Height = _tb.Height-1;
}

復制代碼 代碼如下:

//列表框按鍵事件
void _lb_KeyDown(object sender, KeyEventArgs e)
{
if (_lb.Items.Count == 0 || !_lb.Visible) return;
if (!_lb_kd_first_top && ((e.KeyCode == Keys.Up && _lb.SelectedIndex == 0) || (e.KeyCode == Keys.Down && _lb.SelectedIndex == _lb.Items.Count)))
{
_lb.SelectedIndex = -1;
TextBoxText = _general_text;
}
else
{
TextBoxText = ((DataRowView)_lb.SelectedItem)[ValueName].ToString();
_lb_kd_first_top = _lb.SelectedIndex != 0;
}
if (e.KeyCode == Keys.Enter && _lb.SelectedIndex != -1)
{
_lb.Visible = false;
this.Height = _tb.Height;
_tb.Focus();
}
}
//列表鼠標單擊事件
void _lb_Click(object sender, EventArgs e)
{
if (_lb.SelectedIndex != -1)
{
TextBoxText = ((DataRowView)_lb.SelectedItem)[ValueName].ToString();
}
_lb.Visible = false;
_tb.Focus();
this.Height = _tb.Height;
}

復制代碼 代碼如下:

//文本框按鍵事件
void _tb_KeyDown(object sender, KeyEventArgs e)
{
if (_lb.Items.Count == 0||!_lb.Visible) return;
bool _is_set = false;
if (e.KeyCode == Keys.Up)
{
if (_lb.SelectedIndex <= 0)
{
_lb.SelectedIndex = -1;
TextBoxText = _general_text;
}
else
{
_lb.SelectedIndex--;
_is_set = true;
}
}
else if (e.KeyCode == Keys.Down)
{
if (_lb.SelectedIndex == _lb.Items.Count - 1)
{
_lb.SelectedIndex = 0;
_lb.SelectedIndex = -1;
TextBoxText = _general_text;
}
else
{
_lb.SelectedIndex++;
_is_set = true;
}
}
else if (e.KeyCode == Keys.Enter)
{
_lb.Visible = false;
this.Height = _tb.Height;
_is_set = _lb.SelectedIndex != -1;
}
_lb_kd_first_top = _lb.SelectedIndex != 0;
if (_is_set)
{
_text_lock = true;
_tb.Text = ((DataRowView)_lb.SelectedItem)[ValueName].ToString();
_tb.SelectionStart = _tb.Text.Length + 10;
_tb.SelectionLength = 0;
_text_lock = false;
}
}
//文本框文本變更事件
void _tb_TextChanged(object sender, EventArgs e)
{
if (_text_lock) return;
_general_text = _tb.Text;
_lb.Visible = true;
_lb.Height = _lb.ItemHeight * (_itemCount+1);
this.BringToFront();
_lb.BringToFront();
this.Height = _tb.Height + _lb.Height;
DataTable temp_table = _dt_datasource.Clone();
string filtStr = FormatStr(_tb.Text);
DataRow [] rows = _dt_datasource.Select(string.Format(GetFilterStr(),CodeName,filtStr,_lb.DisplayMember));
for (int i = 0; i < rows.Length&&i<_itemCount; i++)
{
temp_table.Rows.Add(rows[i].ItemArray);
}
_lb.DataSource = temp_table;
if (_lb.Items.Count > 0) _lb.SelectedItem = _lb.Items[0];
}

復制代碼 代碼如下:

/// <summary>
/// 初始化控件
/// </summary>
private void InitialControls()
{
_lb_kd_first_top = true;
_tb = new TextBox();
_tb.Location = new Point(0, 0);
_tb.Margin = new System.Windows.Forms.Padding(0);
_tb.Width = this.Width;
_tb.TextChanged += new EventHandler(_tb_TextChanged);
_tb.KeyUp += new KeyEventHandler(_tb_KeyDown);
_lb = new ListBox();
_lb.Visible = false;
_lb.Width = _tb.Width;
_lb.Margin = new System.Windows.Forms.Padding(0);
_lb.DisplayMember = ValueName;
_lb.SelectionMode = SelectionMode.One;
_lb.Location = new Point(0, _tb.Height);
_lb.KeyUp += new KeyEventHandler(_lb_KeyDown);
_lb.Click += new EventHandler(_lb_Click);
this.Controls.Add(_tb);
this.Controls.Add(_lb);
this.Height = _tb.Height - 1;
this.LostFocus += new EventHandler(AutoComplete_LostFocus);
this.Leave += new EventHandler(AutoComplete_LostFocus);
this.Load += new EventHandler(AutoComplete_Load);
}
/// <summary>
/// 獲取過濾格式字符串
/// </summary>
/// <returns></returns>
private string GetFilterStr()
{
//未過濾注入的字符 ' ] %任意 *任意
string filter = " {0} like '{1}%' and IsNull([{2}], ' ') <> ' ' ";
if (_dt_datasource.Rows[0][CodeName].ToString().LastIndexOf(';') > -1)
filter = " {0} like '%;{1}%' and IsNull([{2}],' ') <> ' ' ";
return filter;
}
/// <summary>
/// 過濾字符串中一些可能造成出錯的字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private string FormatStr(string str)
{
if (string.IsNullOrEmpty(str)) return string.Empty;
str = str.Replace("[", "[[]").Replace("%", "[%]").Replace("*", "[*]").Replace("'", "''");
if (CodeName == "code") str = str.Replace(" ", "");
return str;
}

下面是使用控件的例子
復制代碼 代碼如下:

class Common
{
/// <summary>
/// 生成測試數據源
/// </summary>
public static DataTable CreateTestDataSoucre
{
get
{
List<KeyValuePair<string, string>> source = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string,string>("張三",";zs;張三;"),
new KeyValuePair<string,string>("李四",";li;李四;"),
new KeyValuePair<string,string>("王五",";ww;王五;"),
new KeyValuePair<string,string>("趙六",";zl;趙六;"),
new KeyValuePair<string,string>("洗刷",";cs;csharp;c#;洗刷;"),
new KeyValuePair<string,string>("爪哇",";java;爪哇;"),
new KeyValuePair<string,string>("java",";java;"),
new KeyValuePair<string,string>("c#",";c#;cs;csharp;"),
new KeyValuePair<string,string>("javascript",";javascript;js;")
};
DataTable table = new DataTable();
table.Columns.Add("id");
table.Columns.Add("name");
table.Columns.Add("code");
for (int i = 0; i < source.Count; i++)
{
DataRow row = table.Rows.Add();
row["id"] = i;
row["name"] = source[i].Key;
row["code"] = source[i].Value;
}
return table;
}
}
}
//.............
AutoComplete ac=new AutoComplete();
ac.ValueName = "name";
ac.CodeName = "code";
ac.DataSource= Common.CreateTestDataSoucre;
ac.ItemCount= 5;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲女性裸体视频| 国产精品国产福利国产秒拍| 亚洲欧美综合区自拍另类| 国产一区二区免费| 一区二区在线免费视频| xxx一区二区| 日韩精品视频在线免费观看| 国产成人亚洲综合青青| 国产在线观看91精品一区| 国产日韩精品一区二区| 国产精品久久久久久搜索| 九九视频这里只有精品| 国产精品福利网站| 综合欧美国产视频二区| 色老头一区二区三区在线观看| 欧美午夜视频一区二区| 国产中文字幕91| 久久精品视频网站| 日韩精品有码在线观看| 69av在线播放| 亚洲视频在线免费看| 成人国产精品日本在线| 欧美专区国产专区| 精品毛片网大全| 中文字幕亚洲无线码a| 国产精品日韩在线一区| 这里精品视频免费| 狠狠色狠狠色综合日日小说| 最新国产精品拍自在线播放| 欧美亚州一区二区三区| 日韩av在线最新| 亚洲国产天堂久久综合| 国产精品91在线| 中文字幕一区二区精品| 成人福利视频在线观看| 国产精品视频自拍| 亚洲国产精品久久久久久| 高清欧美性猛交xxxx| www.欧美精品一二三区| 91精品国产综合久久香蕉的用户体验| 国产精品96久久久久久| 国产精品视频资源| 日韩欧美成人网| 精品久久久久久电影| 欧美亚洲国产成人精品| 欧美在线性视频| 欧美性理论片在线观看片免费| 欧美一区二粉嫩精品国产一线天| 精品人伦一区二区三区蜜桃免费| 亚洲国产古装精品网站| 日韩中文理论片| 欧美亚洲在线观看| 亚洲人成77777在线观看网| 亚洲最大的av网站| 欧美小视频在线| 欧美丝袜一区二区| 性欧美长视频免费观看不卡| 欧美日韩国产中文精品字幕自在自线| 亚洲一区二区三区香蕉| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品成人久久电影| 日韩久久免费视频| 91在线精品播放| 96pao国产成视频永久免费| 亚洲sss综合天堂久久| 亚洲最大av网站| 欧美在线中文字幕| 国产视频福利一区| 九色精品免费永久在线| 日本高清视频一区| 国产精品毛片a∨一区二区三区|国| 欧美亚洲午夜视频在线观看| 国产精品第一区| 国产精品久久久久久久久免费| 国产成人精品a视频一区www| 青青草成人在线| 国产做受69高潮| 亚洲娇小xxxx欧美娇小| 色偷偷9999www| 欧美激情在线一区| 欧美精品电影免费在线观看| 欧美成人剧情片在线观看| 国产精品丝袜久久久久久不卡| 国产欧美精品日韩| 在线观看亚洲区| 欧美二区乱c黑人| 亚洲精品欧美极品| 欧美黄色小视频| 国产日韩在线一区| 亚洲美女性生活视频| 国产欧美日韩中文字幕在线| 日韩久久午夜影院| 国产日韩欧美在线观看| 亚洲福利视频网站| 亚洲欧美国产一本综合首页| 国产精品久久久久999| 欧美精品一区二区三区国产精品| 狠狠综合久久av一区二区小说| 亚洲色图25p| 国产成人精品久久二区二区91| 91免费国产视频| 久久av资源网站| 精品久久久久久久久国产字幕| 韩剧1988在线观看免费完整版| 91成人免费观看网站| 538国产精品一区二区免费视频| 精品夜色国产国偷在线| 欧美最猛性xxxxx(亚洲精品)| 丝袜亚洲欧美日韩综合| 亚洲男人第一av网站| 伊人伊人伊人久久| 日韩电影网在线| 日韩精品福利网站| 国产精品嫩草影院一区二区| 亚洲人午夜精品| 国产精品福利在线观看网址| 久久精品这里热有精品| 亚洲自拍偷拍色片视频| 久久久亚洲精选| 日韩在线精品视频| 久久久久久欧美| 狠狠色狠狠色综合日日小说| 国产精品视频久久久久| 中文字幕亚洲在线| 亚洲精品99久久久久| 日韩av网址在线观看| 亚洲r级在线观看| 91精品久久久久久久| 狠狠综合久久av一区二区小说| 91久久久久久久久久久久久| 亚洲黄页视频免费观看| 国产精品网址在线| 欧美日韩在线观看视频小说| 亚洲成人动漫在线播放| 另类少妇人与禽zozz0性伦| 亚洲欧美制服丝袜| 国产一区二区三区在线播放免费观看| 欧美性生活大片免费观看网址| 久久99视频精品| 欧美黑人性视频| 一本色道久久综合亚洲精品小说| 日韩av在线免费观看一区| 久久影院资源站| 国产精品免费看久久久香蕉| 日韩av一区二区在线| 青青草原一区二区| 孩xxxx性bbbb欧美| 91福利视频在线观看| 伊人男人综合视频网| 成人日韩在线电影| 国产精品专区h在线观看| 国产精品男人爽免费视频1| 亚洲欧美精品伊人久久| 欧美一级电影久久| 成人黄色片网站| 国产精品久久久av久久久| 国产成人中文字幕| 久久偷看各类女兵18女厕嘘嘘| 国产精品女主播| 欧美日韩免费在线| 精品久久久久久亚洲精品| 欧美激情xxxxx| 欧美在线观看视频| 久久精品福利视频|