datagridview单元格中输入一个值按下tab后判断该值是否存在数据库中

在datagridview单元格中输入字符串 按下tab光标移到下一单元格 此时自动判断该字符串是否存在于sql数据库中,存在则messagebox show XXXX已存在,若不存在,无任何操作

7个回答

图片说明

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add("id", "NO.");
            dataGridView1.Columns.Add("name", "姓名");
            DataClasses1DataContext db = new DataClasses1DataContext();
            foreach (var item in db.Table1s)
            {
                dataGridView1.Rows.Add(new object[] { item.id, item.name });
            }
            dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
        }

        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1)
            {
                DataClasses1DataContext db = new DataClasses1DataContext();
                string name = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                if (db.Table1s.Any(x => x.name == name))
                {
                    MessageBox.Show(name + " 已经存在!");
                }
            }
        }
    }
}

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复wodexinhao: 因吹斯汀+亦可赛艇,你继续。
大约 2 年之前 回复
wodexinhao
wodexinhao 回复dabocaiqq: 好吧,我接受你的批评,之前的回复确实有些不妥,对于同一个问题有不同意见和解决方案,贴出来互相交流就好了,不应该那样说的,如果伤害到你的幼小心灵了,跟你说声对不起,以后认真帮助别人就好了
大约 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复wodexinhao: 只会复制粘贴的主,随便点开几个问题都可以看到你复制粘贴的身影,都被提问的人骂过了,还不知羞耻 ,这说的不是那谁么?哈哈
大约 2 年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复wodexinhao: 就你牛,行了吧。你看你多么遭人讨厌,这里没有一个人不批评你的,你居然还狡辩,真服了你的自信心。
大约 2 年之前 回复
wodexinhao
wodexinhao 回复caozhy: 自己去动手一下就知道优劣在哪里,缺陷在哪里,没有动手就来瞎逼逼,只会到处复制粘贴
大约 2 年之前 回复
wodexinhao
wodexinhao 回复caozhy: 你就别丢人现眼了,只会复制粘贴的主,随便点开几个问题都可以看到你复制粘贴的身影,都被提问的人骂过了,还不知羞耻
大约 2 年之前 回复
zqbnqsdsmd
我是天才蓝玻丸 特地赶过来支持下菠菜老师!
大约 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复showbo: 还是bobo说的到位!
大约 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复wodexinhao: 呵呵,我只是就事论事,技术到家的那位,你的代码我也看了,说实话没看出高明在哪里。
大约 2 年之前 回复
wodexinhao
wodexinhao 呵呵,只能说明你技术不到家,按照楼主的要求肯定是要处理Tab键消息的,当然鼠标操作也是要处理的,不然的话都是不完善的残缺的,楼主如果还能看到这些回复,我建议你采纳一楼的意见,毕竟他是第一个出来给你认真回答问题的,而且还是很用心的给你写了代码,虽然没有完美解决你的问题,但是说句实在话,凡是第一个认真回答问题,而且只要不是错误的答案,都应该得到奖励
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 贴代码,大道理谁都懂,楼主要是会就不会提问了。按tab键原本就不怎么合理,鼠标操作那就无法判断重复了,楼主实际需求还是没搞清楚,endedit是最好的办法
大约 2 年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复wodexinhao: 通过贬损别人的回答来混一点分,你恨无耻,没关系,随便你说。lz的问题我也回答了很多次了。你是什么东西,lz自有评价。
大约 2 年之前 回复
wodexinhao
wodexinhao 仔细看了一下,楼主问你很久不回复,在我回复之后倒回复的挺快,这是什么原因,明白人都看得出来
大约 2 年之前 回复
wodexinhao
wodexinhao 你用小号去踩别人,没关系,这是小人的手段,都是为了真心帮助人家,不是为了这点分数,看看你说的什么话"lz如果觉得他的方法好,我也就不进一步回答了" 我看了下时间,过了这么久了,你也不回复人家,不给人家修改,还说出这样的话,不管你采纳谁的意见,只要你留下邮箱,我把实例代码发过去,其实主要代码都贴在这里了,不发应该自己会写了,希望能对楼主有帮助,采不采纳无所谓,但是如果楼主觉得好说一声谢谢就好了
大约 2 年之前 回复
wodexinhao
wodexinhao 你怎么知道我的没有加入鼠标操作的情况,做了就做到最完美,当然鼠标操作也一样有同样的功能的,你不处理Tab键消息,那只能是有缺陷方案
大约 2 年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复wodexinhao: 你的方法才投机取巧,如果用户用鼠标操作,而不是按tab移动单元格呢。lz如果觉得他的方法好,我也就不进一步回答了。lz觉得我的回答好,才那以后,我上sql的版本。
大约 2 年之前 回复
wodexinhao
wodexinhao 这个方案并不理想,请看我给你的理想解决方案
大约 2 年之前 回复
Csharpsss
Csharpsss 能不能不在datagridview显示sql中原有的数据 按tab后直接查询sql
大约 2 年之前 回复
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Q692913
{
    public partial class Form1 : Form
    {
        private string connstr = "Data Source=.\\sqlexpress;Initial Catalog=Q692913DB;Integrated Security=True;Pooling=False";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add("id", "NO.");
            dataGridView1.Columns.Add("name", "姓名");
            SqlConnection conn = new SqlConnection(connstr);
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from table1", conn);
            var reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                dataGridView1.Rows.Add(new object[] { reader["id"].ToString(), reader["name"].ToString() });
            }
            reader.Close();
            conn.Close();
            dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
        }

        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1)
            {
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                string name = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                SqlCommand cmd = new SqlCommand("select count(*) from table1 where name=N'" + name + "'", conn);
                int count = (int)cmd.ExecuteScalar();
                if (count > 0)
                {
                    MessageBox.Show(name + " 已经存在!");
                }
            }
        }
    }
}

Csharpsss
Csharpsss 回复dabocaiqq: 很感谢你和那个showbo 新手的我突然感觉学到了蛮多的哈哈哈
大约 2 年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复caozhy: 还是谢谢你们。
大约 2 年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复caozhy: 嗯。我还是贴出来好了。之前给出linq也是觉得有了linq,lz自己完全可以写出sql的。因为思路和程序的结构都是一样的。
大约 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 没错,sql的思路是一样的,建议lz对照下看就明白了。还是linq好用。
大约 2 年之前 回复

图片说明

Csharpsss
Csharpsss 回复wodexinhao: 我已经自己解决了 谢谢你们
大约 2 年之前 回复
wodexinhao
wodexinhao 首先要跟你说声对不起,之前不应该那样说的,不过作为正常的交流,就单单这个问题上的交流,还是要跟你说一下:你可以看看弹出消息,你点击确定之后,这个Tab消息还是继续往下发,所以变成了你点击了“”确定“”之后,焦点变成了下一个单元格,而且没有进入编辑状态,如果这个值已经存在的情况是需要停留在当前单元格,且保持编辑状态的,所以这个问题是需要接管DataGridView的Tab消息然后结合CellEndEdit一起来处理的,不是单单处理Tab键消息或者CellEndEdit消息,你看看我的效果图,就是两者结合的方案,你可以按照我的方案去实现一下看看,互相交流,互相学习提高
大约 2 年之前 回复

这里可以采用鼠标离开事件onblur 然后利用ajax请求数据库返回对应状态或数据。希望采纳。

一楼的答案看似实现了你的功能,但是并不是最理想的方案,你需要的是处理Tab键消息,实现你想要的功能,一楼在EndEdit事件中处理当然是不理想的,因为当你在编辑某个单元格的时候,编辑完成按下Tab键后那么会先自动结束编辑状态,所以一楼投机取巧的在EndEdit方法中来处理会是怎么样的呢?两种情况,一:数据库中已经存在这个字符串,那么弹出你需要的提示消息,然后再处理Tab键消息,跳转到下一个单元格,显然这不是你想要的,你想要的是停留在当前单元格的编辑状态,重新编辑这个单元格的值。二:数据库中不存在相同的字符串值,那么跳转到下一个单元格。最好的处理方法当然是重写ProcessCmdKey 方法,然后自己处理Tab键消息。至于判断据库中是否有相同的字符串,你直接用sql查询命令查询就可以了,或者用专门操作sql的库去操作,网络上很多相关的控件或者库,很方便,在这里给你贴一个简单的操作sql操作代码参考一下

 public class DBHelper
    {
        SqlConnection con = null;
        public DBHelper()
        {
            con = CreateConnection();
            con.Open();
        }

        /// <summary>
        /// 创建数据库连接
        /// </summary>
        /// <returns></returns>
        public SqlConnection CreateConnection()
        {
                    //这里链接数据库的字符串换成你自己实际的字符串链接字符串
            SqlConnection con = new SqlConnection("Data Source=.;Database=Kb.Data;Integrated Security=SSPI;");
            return con;
        }

        /// 最常用的是用下面的语句,实际运用中需要根据需要修改语句,比如要考虑执行效率等问题,还可以用 select isnull((select top(1) 1 from tableName where  查询条件), 0)
                /// if exists (select * from tableName where 查询条件) select '1' else select '0'
        /// <summary>
        /// 判断某字段的值是否存在于数据库中
        /// </summary>
        /// <param name="TableName">查询的表名</param>
        /// <param name="KeyName">字段名</param>
        /// <param name="KeyValue">字段值</param>
        /// <returns></returns>
        public bool IsValueExists(string TableName, string KeyName, string KeyValue)
        {
            if (string.IsNullOrEmpty(KeyName) == true || string.IsNullOrEmpty(KeyValue) == true)
                return false; 

            string sql = "SELECT COUNT(*) FROM " + TableName + " WHERE " + KeyName + "='" + KeyValue + "'";
            SqlCommand cmd = new SqlCommand(sql, con);
            int count = Convert.ToInt32(cmd.ExecuteScalar());
            return count > 0 ? true : false;
        }

        public DataTable SearchValue(string TableName, string KeyName = "", string KeyValue = "")
        {
            string sql = "SELECT id,number,name FROM " + TableName + " WHERE 1=1";
            if (string.IsNullOrEmpty(KeyName) == false && string.IsNullOrEmpty(KeyValue) == false)
                sql = " AND " + KeyName + "=" + KeyValue;

            SqlCommand cmd = new SqlCommand(sql, con);

            DataTable table = new DataTable(TableName);
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            adapter.Fill(table);
            return table;
        }
    }

重写ProcessCmdKey方法处理Tab消息

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Tab)
            {
                if (dataGridView1.IsCurrentCellInEditMode)
                {
                    int irows = dataGridView1.CurrentCell.RowIndex;
                    int icols = dataGridView1.CurrentCell.ColumnIndex;

                    if (irows > -1 && icols > -1)
                    {
                        dataGridView1.EndEdit();
                        //从数据库中查询数据是否存在
                        string value = dataGridView1.Rows[irows].Cells[icols].Value.ToString();
                        DBHelper db = new DBHelper();
                        if (db.IsValueExists("dbo.UserInfo", dataGridView1.Columns[icols].DataPropertyName, value))
                        {
                            MessageBox.Show(value + " 已存在");
                            dataGridView1.BeginEdit(true);
                            return true;
                        }
                        else
                        {
                            SendKeys.Send("{Tab}");
                            return base.ProcessCmdKey(ref msg, keyData);
                        }
                    }
                }
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

告诉我邮箱,给你发示例代码过去,效果如下图
图片说明

dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复caozhy: 没错,就是这样
大约 2 年之前 回复
wodexinhao
wodexinhao 回复caozhy: 你就别丢人现眼了,只会复制粘贴的主,随便点开几个问题都可以看到你复制粘贴的身影,都被提问的人骂过了,还不知羞耻
大约 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 觉得你的技术和你的做人都不怎么样。
大约 2 年之前 回复
wodexinhao
wodexinhao 回复devmiao: 请你认真看看,我有那句话诋毁人家了,只是从纯技术角度去分析,哪句话说了不要采纳某某意见了?就算是已经结贴了,既然看到了,也要发一下,让后面的人不要掉坑里,不是来这里抢分数的,说实在的,这个分数有什么用,用处不大,如果需要下载资源,分数不够,充值就好了,还有人要争这没用的分数?嗯......悲哀啊,没弄清楚别人的意图之前就乱喷,这样不好吧
大约 2 年之前 回复
wodexinhao
wodexinhao 呵呵,我知道你们都是老人比较熟了,我是最近才来这个版块,不打嘴仗,我并不是诋毁,只是指出不足而已,那么请楼主采纳一楼的意见吧,我只是提供给楼主参考,我说了,只要楼主发邮箱过来就发过去,没必要去论,只要能真的帮到人就好
大约 2 年之前 回复
devmiao
见了你女王大人喵姐还不跪下 姐姐给你点个踩。先不谈技术高低,诋毁人家说明你是个小人。
大约 2 年之前 回复

当然了,你如果想要获取焦点的同时进入编辑状态,就是按下Tab键,跳转到下一个单元格,自动进入编辑状态,就是移动光标的效果,那么加一个CellEnter事件就好了

 private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            dataGridView1.BeginEdit(true);
        }

图片说明

dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复zqbnqsdsmd: 老师不敢当。只是一起讨论技术吧。
大约 2 年之前 回复
zqbnqsdsmd
我是天才蓝玻丸 嗯,我就是菠菜老师的小号,就给你点踩,就是看你恶意中伤菠菜老师不爽,你来咬我啊
大约 2 年之前 回复

在这里声明一下,我只是看到楼主的问题还没解决,纯粹想帮楼主而已,楼主如果还能看到这些回复,我建议你采纳一楼的意见,毕竟他是第一个出来给你认真回答问题的,而且还是很用心的给你写了代码,虽然没有完美解决你的问题,但是说句实在话,凡是第一个认真回答问题,而且只要不是错误的答案,都应该得到奖励,你采纳楼主的建议之后我会详细给你分析这个问题,而且把实例代码发给你,按照你的要求肯定是要处理Tab消息的,当然你不用Tab键,用鼠标操作的时候也是要处理的,不然的话都不能够说完整实现了你想要的功能完整代码你可以留下邮箱,给你发过去

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐