【问题标题】:Textbox event for autocomplete for gridview in winformwinform中gridview自动完成的文本框事件
【发布时间】:2015-02-24 16:07:47
【问题描述】:

我一直在网上寻找正确的事件,用于文本框自动生成建议,如 google.com,因此我不必输入整个单元格值来查找我要查找的内容。目前,我有一个按钮,单击该按钮会将网格过滤为我要求的内容,而不仅仅是使用文本框进行过滤。我知道有 Keypress、textchanged 等,我尝试了不同的事件来查看 datagridview 是否在我键入时进行过滤。没有成功。当我键入时,按键事件不会过滤。 textchanged 事件不允许我在文本框中输入。那么我怎样才能做到这一点呢?

代码:

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 SampleARDUserGroup
{
    public partial class FirstPage : Form
    {
        SqlConnection con;
        SqlDataAdapter adap;
        DataSet ds;
        SqlCommandBuilder cmbl;
        public FirstPage()
        {
            InitializeComponent();
        }

        private void FirstPage_Load(object sender, EventArgs e)
        {


            try
            {
                con = new SqlConnection();
                con.ConnectionString = "My Data Source";
                con.Open();
                adap = new SqlDataAdapter("select RowID as 'ID',UserID as 'User ID', FirstName as 'First Name', LastName as 'Last Name', email as 'E-mail' from JoshTestTable", con);
                ds = new System.Data.DataSet();
                adap.Fill(ds, "User_Details");
                DGV1.DataSource = ds.Tables[0];
                DGV1.Columns[0].Visible = false;
                DGV1.Columns[2].Visible = false;
                DGV1.Columns[3].Visible = false;
                DGV1.Columns[4].Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            con = new SqlConnection();
            con.ConnectionString = "My Data Source";
            SqlDataAdapter sda = new SqlDataAdapter("Select UserID,FirstName,LastName,Email FROM JoshTestTable where UserID like '%" + txtSearch.Text.Trim() + "%' OR FirstName like '%" + txtSearch.Text.Trim() + "%' OR FirstName like '%" + txtSearch.Text.Trim() + "%' OR LastName like '%" + txtSearch.Text.Trim() + "%' OR Email like '%" + txtSearch.Text.Trim() + "%'", con);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            DGV1.DataSource = dt;
            DGV1.Columns[1].Visible = false;
            DGV1.Columns[2].Visible = false;
            DGV1.Columns[3].Visible = false;

        }

        private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            AddDeleteUsers f2 = new AddDeleteUsers();
            f2.ShowDialog(); 
        }

        private void AddUsersToGroupsLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            AddUsersToGroups f3 = new AddUsersToGroups();
            f3.ShowDialog(); 
        }

        private void AddGroupsToUsersLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            AddGroupsToUsers f4 = new AddGroupsToUsers();
            f4.ShowDialog(); 
        }

        private void txtSearch_TextChanged(object sender, EventArgs e)
        {
            AutoCompleteStringCollection namesCollection = new AutoCompleteStringCollection();

            SqlConnection con = new SqlConnection();
            con.ConnectionString = "My Data Source";
            con.Open();
            String query = "select UserID from JoshTestTable  where UserID like '%" + txtSearch.Text + "%'";
            SqlCommand cmd = new SqlCommand(query, con);
            SqlDataReader rr = cmd.ExecuteReader();
            rr.Read();
            while (rr.Read())
                namesCollection.Add(rr["UserID"].ToString());
            rr.Close();
            txtSearch.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtSearch.AutoCompleteSource = AutoCompleteSource.CustomSource;
            txtSearch.AutoCompleteCustomSource = namesCollection;
        }      
    }
}

【问题讨论】:

    标签: c# sql winforms datagridview


    【解决方案1】:

    因为,显然,txtSearch_TextChanged 事件中查询中的 where 条件应该是这样的

    String query = 
        "select UserID from JoshTestTable where UserID like '%" +
        txtSearch.Text.Trim() + "%' OR FirstName like '%" +
        txtSearch.Text.Trim() + "%' OR FirstName like '%" +
        txtSearch.Text.Trim() + "%' OR LastName like '%" +
        txtSearch.Text.Trim() + "%' OR Email like '%" +
        txtSearch.Text.Trim() + "%'";
    

    作为您的btnSearch_Click 事件。或者只是你可以从一个点查询数据库,例如:

    private void txtSearch_TextChanged(object sender, EventArgs e)
    {
        btnSearch_Click(null, null);
    }
    

    更新

    您必须使用您输入的内容填写自定义来源。例如,我在示例中使用了 Last Name 字段,它对我有用:

    private void txtSearch_TextChanged(object sender, EventArgs e)
    {
        var con = new SqlConnection("{your connection string}");
        con.Open();
        String query = "select LastName from JoshTestTable where LastName like '%" + txtSearch.Text.Trim() + "%'";
        var cmd = new SqlCommand(query, con);
        var rr = cmd.ExecuteReader();
        var namesCollection = new AutoCompleteStringCollection();
        while (rr.Read())
            namesCollection.Add(rr["LastName"].ToString());
        rr.Close();
        con.Close();
        txtSearch.AutoCompleteCustomSource = namesCollection;
        txtSearch.AutoCompleteMode = AutoCompleteMode.Suggest;
        txtSearch.AutoCompleteSource = AutoCompleteSource.CustomSource;
    }
    

    【讨论】:

    • 我有一个按钮仅用于测试目的。当我在我的文本框上获得自动完成功能时,我不想要该按钮。我尝试了您提供的查询,但在我在文本框中键入时它仍然没有过滤。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2012-03-28
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多