通过输入成语的拼音缩写来查询成语,最近做了一些尝试,查了一些资料,感谢csdn的开源代码。
原来计划使用.NET开发,查了很久感觉最可利用的是winform,于是先学习一下吧,先form吧!第二步才是net!
form建立3个控件,1个textbox,1个listbox,一个datagridview。
上图:
后台代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace textbox下拉提示
{
public partial class Form1 : Form
{
DataTable dt = new DataTable();//在内存中创建一个表,在这里定义这个表保证在程序运行时候数据总是存在
public Form1()
{
InitializeComponent();
}
private void textBox_拼音缩写_TextChanged(object sender, EventArgs e)//在文本框里输入字的时候触发的事件执行的语句.
{
listBox2.Items.Clear(); //这个必须清空,否则积存上次的数据
DataRow[] dr = dt.Select("名称 like'%" + textBox_拼音缩写.Text + "%'");
DataTable newdt = new DataTable(); //再新创建一个表,
newdt=dt.Clone();//复制dt表的所有结构
foreach (DataRow row in dr) { newdt.Rows.Add(row.ItemArray); }//这一句,可以改成用for循环替代, 循环内就用 newdt.ImportRow(dr[i]);
if (dt.Rows.Count > 0 && (textBox_拼音缩写.Text != ""))//如果这个DS表里的行数总数,大于零,并且文本框不为空,就运行以下代码
{
listBox2.Visible = true; //listBox2显示出来
for (int i = 0; i < newdt.Rows.Count; i++)//循环所有行数
{
listBox2.Items.Add(newdt.Rows[i]["成语"].ToString());//每行的名称值给listBox2
}
}
}
private void textBox_拼音缩写_KeyUp(object sender, KeyEventArgs e)//这个事件, 作用是按上下键选择下拉列表里的值
{
if (e.KeyCode == Keys.Up)//如果按了向上键
{
int idx = listBox2.SelectedIndex;//获取当前所选择的是哪一项
if (idx == -1)//如果所选荐是-1,就表示没有选中任何值,是刚进入的
{
listBox2.SelectedItem = listBox2.Items[listBox2.Items.Count - 1];//让他选中最后一个,也就是总数减1
}
else
{
if (idx == 0)//等于零,表示此时选中的是在第一行.
{
listBox2.SelectedItem = listBox2.Items[listBox2.Items.Count - 1];//再按向上键,就跳到最后一个.
idx = listBox2.Items.Count;//当前选中的这一行,就是值的总数
}
listBox2.SelectedItem = listBox2.Items[idx - 1];//从下往上一直移动选择, 一直递减1
}
}
else if (e.KeyCode == Keys.Down)//如果按了向下键
{
int idx = listBox2.SelectedIndex;//获取当前所选择的是哪一项
if (idx == -1)//如果所选荐是-1,就表示没有选中任何值,是刚进入的
{
//把下拉列里的第一个(item[0])值,赋给listBox2的SelectedItem属性, 这个属性表示当前被选中的项
listBox2.SelectedItem = listBox2.Items[0];
}
else
{
if (idx == listBox2.Items.Count - 1)//如果idx等于总数减1, 就表示所选中的已经在最后一个了
{
listBox2.SelectedItem = listBox2.Items[0];//就把第一个值,赋给listBox2的SelectedItem属性. 等于从头再开始
}
else
{
listBox2.SelectedItem = listBox2.Items[idx + 1];//不是未选中,也不是最后一项, 就递增1,向下再移动的意思
}
}
idx = listBox2.SelectedIndex;//最后得出结果,再次获取当前所选择的是哪一项
}
else if (e.KeyCode == Keys.Enter && (listBox2.Visible == true))
{
//如果按了回车键,并且这个下拉框是要可见的时候. 隐藏时就按回车无效
textBox_拼音缩写.Text = this.listBox2.SelectedItem.ToString();//把选中的值给文本框
textBox_拼音缩写.Focus();//重新获得焦点
listBox2.Visible = false;//隐藏这个控件
}
}
private void listBox2_MouseDoubleClick(object sender, MouseEventArgs e)
{
textBox_拼音缩写.Text = this.listBox2.SelectedItem.ToString();//把选中的值给文本框
textBox_拼音缩写.Focus();//重新获得焦点
listBox2.Visible = false;//隐藏这个控件
}
private void Form1_Load(object sender, EventArgs e)
{
dgv_Message.DataSource = GetMessage();//设置数据源
listBox2.Items.Clear();//先清空一下这个控件的值. 不然就会造成文本框里不输时,这里面全部都是值
//DataTable dt = new DataTable();//在内存中创建一个表
dt.Columns.Add("名称"); //在表中增加一列, 名称叫做"名称"
dt.Columns.Add("成语"); //在表中增加第二列, 名称叫做"成语"
//dt.Rows.Add("yynj", "一言难尽");//开始一行一行的添加数据
//dt.Rows.Add("ymsh", "一目十行");
//dt.Rows.Add("jgzn", "惊弓之鸟");
//dt.Rows.Add("jdzw", "井底之蛙");//以上这段落, 是手动添加数据到内存中. 这一段可以改为,从SQL中获取数据后,赋值给这个datatable对象
string str = "data source=2s";
SqlConnection myConnection = new SqlConnection(str);
myConnection.Open();
string sqlStr = "select * from t003 ";
SqlDataAdapter myDa = new SqlDataAdapter(sqlStr, myConnection);
DataSet myDs = new DataSet();
myDa.Fill(myDs);
//将成语表的内容放入dt表中
for (int i = 0; i < myDs.Tables[0].Rows.Count; i++)
{
dt.Rows.Add(myDs.Tables[0].Rows[i][2].ToString(), myDs.Tables[0].Rows[i][1].ToString());
}
}
private DataTable GetMessage()
{
string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"data source=2182s");
string P_Str_SqlStr = string.Format(//创建SQL查询字符串
"SELECT * FROM T003");
SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
P_Str_SqlStr, P_Str_ConnectionStr);
DataTable P_dt = new DataTable();//创建数据表
P_SqlDataAdapter.Fill(P_dt);//填充数据表
return P_dt;//返回数据表
}
}
}