Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中的datagridview中自动完成#_C#_Datagridview - Fatal编程技术网

C# 在C中的datagridview中自动完成#

C# 在C中的datagridview中自动完成#,c#,datagridview,C#,Datagridview,我一直在到处寻找我的问题的答案。但是我还没有找到一个满意的答案。现在我的问题来了 我在C#中有一个datagridview,它不绑定到任何数据源。我想让用户在其中一列中输入数据。我需要做的是用autocomplete支持用户 自动完成的数据来自数据库。我可以很好地处理这个问题,但我的问题是建议应该取决于用户输入的字符。 例如,如果用户输入“g”,而我的数据库查询返回“garmal”,则自动完成应该显示它 这对于普通的文本框来说非常容易。但datagridview的问题是,我无法读取用户输入的字符

我一直在到处寻找我的问题的答案。但是我还没有找到一个满意的答案。现在我的问题来了

我在C#中有一个datagridview,它不绑定到任何数据源。我想让用户在其中一列中输入数据。我需要做的是用autocomplete支持用户

自动完成的数据来自数据库。我可以很好地处理这个问题,但我的问题是建议应该取决于用户输入的字符。 例如,如果用户输入“g”,而我的数据库查询返回“garmal”,则自动完成应该显示它

这对于普通的文本框来说非常容易。但datagridview的问题是,我无法读取用户输入的字符。编辑完成后将触发“单元格值已更改”事件。数据库中的数据太多,无法立即添加到自动完成源中。因此,我必须确定用户类型,并根据该类型生成源代码

我有没有办法完成这项任务?请帮忙

以下是我最近使用的代码之一,但无效,它不起作用:

 private void Form2_Load(object sender, EventArgs e)
        {

            string str = @"Data Source=MEDIXPC197;Initial Catalog=Inventory;Integrated Security=True";
            SqlConnection con = new SqlConnection(str);
            SqlDataAdapter da = new SqlDataAdapter("SELECT Product Code from tblmaster", con);
            dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
}

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            string text = dataGridView1.Columns[4].HeaderText;
            if (text.Equals("Product Code")) ;
            {
                TextBox auto_text = e.Control as TextBox;
                if (auto_text != null)
                {
                    auto_text.AutoCompleteMode = AutoCompleteMode.Suggest;
                    auto_text.AutoCompleteSource = AutoCompleteSource.CustomSource;
                    AutoCompleteStringCollection sc = new AutoCompleteStringCollection();
                    add_items(sc);
                    auto_text.AutoCompleteCustomSource = sc;
                }
            }

        }
        public void add_items(AutoCompleteStringCollection column)
        {
            column.Add("test1");
编辑:


我已经使用其他代码(见下文)使其工作,现在我的问题是,建议仅显示如果我键入的字母是从数据库显示的数据的第一个字母,我需要一些东西,当我键入一些东西时,例如,我键入了1,建议将显示“1,typo1,tester1tester,111”


我已经使用其他代码(见下文)使其工作,现在我的问题是,建议仅显示如果我键入的字母是从数据库显示的数据的第一个字母,我需要一些东西,当我键入一些东西时,例如,我键入了1,建议将显示“1,typo1,tester1tester,111”


我以前使用的一个老Win32技巧是创建一个隐藏的文本框。当用户进入单元格时,将文本框准确地移动到单元格上,并用单元格内容填充,然后取消隐藏。当用户在该文本框中时,执行所有正常的textbox-y操作。当用户按tab键、enter键或退出单元格时,将文本框中的文本复制回单元格中,然后(如果焦点转移到另一个要伪造的单元格),重复此过程。您通常可以在整个网格中使用一个文本框,每个文本框不超过一个column@Flydog57,我已经让它工作了,不知怎的,请看我上面的编辑…如果我是你,我会发布解决方案作为答案。关于自动完成而不是第一个字母,我会问一个新问题。我必须说,标准的自动完成只能用第一个字母。您需要编写自己的实现(或搜索第三方)。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            //Left = (MdiParent.ClientRectangle.Width - Width) / 2;
            //Top = (MdiParent.ClientRectangle.Height - Height) / 2;

            DataGridViewTextBoxColumn dgvslno = new DataGridViewTextBoxColumn();
            dgvslno.HeaderText = "Item Code";
            dgvslno.Width = 40;
            dataGridView1.Columns.Add(dgvslno);

            DataGridViewTextBoxColumn dgvpro = new DataGridViewTextBoxColumn();
            dgvpro.HeaderText = "Product Name";
            dgvpro.Width = 40;
            dataGridView1.Columns.Add(dgvpro);
        }

        public AutoCompleteStringCollection AutoCompleteLoad()
        {
            SqlConnection conn = new SqlConnection(@"Data Source=MEDIXPC197;Initial Catalog=Inventory;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("Select ProductCode from tblmaster", conn);
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            AutoCompleteStringCollection mycoll = new AutoCompleteStringCollection();
            while (dr.Read())
            {
                mycoll.Add(dr["ProductCode"].ToString());
            }
            return mycoll;
        }

        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            int column = dataGridView1.CurrentCell.ColumnIndex;
            string headerText = dataGridView1.Columns[column].HeaderText;

            if (headerText.Equals("Item Code"))
            {
                TextBox tb = e.Control as TextBox;

                if(tb != null)
                {
                    tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    tb.AutoCompleteCustomSource = AutoCompleteLoad();
                    tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
                }
            }
            else
            {
                TextBox tb = e.Control as TextBox;
                if (tb !=null)
                {
                    tb.AutoCompleteMode = AutoCompleteMode.None;
                }
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            //Left = (MdiParent.ClientRectangle.Width - Width) / 2;
            //Top = (MdiParent.ClientRectangle.Height - Height) / 2;

            DataGridViewTextBoxColumn dgvslno = new DataGridViewTextBoxColumn();
            dgvslno.HeaderText = "Item Code";
            dgvslno.Width = 40;
            dataGridView1.Columns.Add(dgvslno);

            DataGridViewTextBoxColumn dgvpro = new DataGridViewTextBoxColumn();
            dgvpro.HeaderText = "Product Name";
            dgvpro.Width = 40;
            dataGridView1.Columns.Add(dgvpro);
        }

        public AutoCompleteStringCollection AutoCompleteLoad()
        {
            SqlConnection conn = new SqlConnection(@"Data Source=MEDIXPC197;Initial Catalog=Inventory;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("Select ProductCode from tblmaster", conn);
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            AutoCompleteStringCollection mycoll = new AutoCompleteStringCollection();
            while (dr.Read())
            {
                mycoll.Add(dr["ProductCode"].ToString());
            }
            return mycoll;
        }

        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            int column = dataGridView1.CurrentCell.ColumnIndex;
            string headerText = dataGridView1.Columns[column].HeaderText;

            if (headerText.Equals("Item Code"))
            {
                TextBox tb = e.Control as TextBox;

                if(tb != null)
                {
                    tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    tb.AutoCompleteCustomSource = AutoCompleteLoad();
                    tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
                }
            }
            else
            {
                TextBox tb = e.Control as TextBox;
                if (tb !=null)
                {
                    tb.AutoCompleteMode = AutoCompleteMode.None;
                }
            }
        }
    }
}