C#拼音联想式选择

通过输入成语的拼音缩写来查询成语,最近做了一些尝试,查了一些资料,感谢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;//返回数据表
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值