最近在做毕业设计,同时也在学习C#用到DataGridView时开始觉得很难,经过朋友的帮助和自己的努力,稍微的明白了一些,现在就把我写的方法写下来,大家一起学习,写的不好的地方也请指证。
DataGridView做了新的数据显示控件加入到了.Net 05中,其强大的编辑能力让其成为了数据显示中必不可少的控件。目前对于DataGridView中的更新讲的挺多的,但直接的插入数据好像讲的不是太多,下面就以我的例子说明一下。
1、首先新建一个项目。
2、建立一个数据库连接类LinkDataBase。因为数据库操作有很多都是重复性工作,所以我们写一个类来简化对数据库的操作。
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
using
System.Data.SqlClient;
using
System.Data.Sql;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
Test
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
class LinkDataBase
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//设置连接字符串
private string strSQL;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//与数据库连接
private string connectionString = "Data Source=Localhost;Initial Catalog=Test;Integrated Security=True";
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private SqlConnection myConnection;
private SqlCommandBuilder sqlCmdBld;
private DataSet ds = new DataSet();
private SqlDataAdapter da;
public LinkDataBase()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//根据输入的SQL语句检索数据库数据
public DataSet SelectDataBase(string tempStrSQL, string tempTableName)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.strSQL = tempStrSQL;
this.myConnection = new SqlConnection(connectionString);
this.da = new SqlDataAdapter(this.strSQL, this.myConnection);
this.ds.Clear();
this.da.Fill(ds, tempStrSQL);
//返回填充了数据的DataSet,其中数据表以tempTableName给出的字符串命名
return ds;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//数据库数据更新(传DataSet和DataTable的对象)
public DataSet UpdateDataBase(DataSet changedDataSet, string tableName)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.myConnection = new SqlConnection(connectionString);
this.da = new SqlDataAdapter(this.strSQL, this.myConnection);
this.sqlCmdBld = new SqlCommandBuilder(da);
this.da.Update(changedDataSet, tableName);
//返回更新过的数据库表
return changedDataSet;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//检索数据库数据(传字符串,直接操作数据库)
public DataTable SelectDataBase(string tempStrSQL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.myConnection = new SqlConnection(connectionString);
DataSet tempDataSet = new DataSet();
this.da = new SqlDataAdapter(tempStrSQL, this.myConnection);
this.da.Fill(tempDataSet);
return tempDataSet.Tables[0];
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//数据库数据更新(传字符串,直接操作数据库)
public int UpdateDataBase(string tempStrSQL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.myConnection = new SqlConnection(connectionString);
myConnection.Open();
SqlCommand tempSqlcommand = new SqlCommand(tempStrSQL, this.myConnection);
int intNumber = tempSqlcommand.ExecuteNonQuery();
myConnection.Close();
return intNumber;
}
}
}
上面这段代码很容易理解。大大的简化了我们的操作。
2、建立一个DataGridView控件,将其命名。(我这里把他命名成:dgv_type)。再加入一个Combobox控件来实现定位到某格时出现下拉列表框。其实DataGridView具有DataGridViewCombobxColumn属性,但这样做出来的下拉框不如绑定一个Combobox控件美。
![]()
3、下面进行代码绑定
将数据表Sex中的Sex字段传给Combobox做为Item使用。
public
void
BindType()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
string tempStrSQL = "select Sex from Sex";
tempDataTable = link.SelectDataBase(tempStrSQL);
for (int i = 0; i < tempDataTable.Rows.Count; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//将Sex中性别字段传给Combobox
this.cmb_sex.Items.Add(tempDataTable.Rows[i][0]);
}
}
4、建立DataGridView的CurrentCellChanged事件,产生当焦点进入某单元格内出现Combobox的效果
private
void
dgv_type_CurrentCellChanged(
object
sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (this.dgv_type.CurrentCell.ColumnIndex == 2)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Rectangle rect = dgv_type.GetCellDisplayRectangle(dgv_type.CurrentCell.ColumnIndex, dgv_type.CurrentCell.RowIndex, false);
cmb_sex.Left = rect.Left;
cmb_sex.Top = rect.Top;
cmb_sex.Width = rect.Width;
cmb_sex.Height = rect.Width;
cmb_sex.Visible = true;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cmb_sex.Visible = false;
}
}
5、建立Combobox的SelectedIndexChanged事件,当改变时,将值传送给DataGridView相应的单元格内。
记得啊,比较字符时一定要加上.Trim()去掉空格,当数据库中字段类型为nchar时后面会产生空格造成比较结果不同。例如“男”和“男 ”可是不一样的啊>.<。所以为了良好的习惯最好还是加上.Trim()。
private
void
cmb_sex_SelectedIndexChanged(
object
sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (((ComboBox)sender).Text.Trim() == "男")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.CurrentCell != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dgv_type.CurrentCell.Value = "男";
dgv_type.CurrentCell.Tag = "1";
}
}
if (((ComboBox)sender).Text.Trim() == "女")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.CurrentCell != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dgv_type.CurrentCell.Value = "女";
dgv_type.CurrentCell.Tag = "2";
}
}
}
6、建立DataGridView的DataBindingComplete事件,用来显示单元格内的值
private
void
dgv_type_DataBindingComplete(
object
sender, DataGridViewBindingCompleteEventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
for (int i = 0; i < this.dgv_type.Rows.Count; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.Rows[i].Cells[1].Value != null && dgv_type.Rows[i].Cells[1].ColumnIndex == 1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Tag = dgv_type.Rows[i].Cells[1].Value.ToString();
if (dgv_type.Rows[i].Cells[1].Value.ToString() == "1")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Value = "男";
}
else if (dgv_type.Rows[i].Cells[1].Value.ToString() == "2")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Value = "女";
}
}
}
}
7、最后把所有的事件放到Load中
private
void
Form1_Load(
object
sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
BindType();
cmb_sex.SelectedIndexChanged += new EventHandler(cmb_sex_SelectedIndexChanged);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
this.dgv_type.Controls.Add(cmb_sex);
}
现在可以在表中输入数据了。输入数据后呢,当然我们要把他们保存到数据库内。
8、建立一个Button控件来实现数据的保存。其中使用了一个rowMax来记录DataGridView中输入数据的最大行号。因为在保存后有时还要继续向表内输入数据,这样做可以记录下先前保存时的最大行号,避免重复输入数据的错误。(好像Adapter.updata()可以更新,但我不会。。。。。。这里也希望请教一下)
private
void
btn_save_Click(
object
sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
string tempStrSQL;
//rowMax为当前DataGridView中最大行号
for (int i = rowMax; rowMax < this.dgv_type.Rows.Count; rowMax++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (this.dgv_type.Rows[rowMax].Cells[0].Value == null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
break;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string ID = dgv_type.Rows[rowMax].Cells[0].Value.ToString().Trim();
string Name = dgv_type.Rows[rowMax].Cells[1].Value.ToString().Trim();
string Sex = dgv_type.Rows[rowMax].Cells[2].Value.ToString().Trim();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
string sendValues = "('" + ID + "','" + Name + "','" + Sex + "')";
tempStrSQL = "insert Name (ID,Name,Sex) values " + sendValues;
link.UpdateDataBase(tempStrSQL);
}
}
MessageBox.Show("保存成功", "信息");
}
至此,基本就完成了,下面给出所有代码。
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Data.SqlClient;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
Test
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public partial class Form1 : Form
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
private DataSet ds = new DataSet();
private SqlDataAdapter da = new SqlDataAdapter();
private DataTable tempDataTable;
private LinkDataBase link = new LinkDataBase();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//用来存放DataGridView中输入数据的最大行号
private int rowMax = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public Form1()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
InitializeComponent();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private void Form1_Load(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
BindType();
cmb_sex.SelectedIndexChanged += new EventHandler(cmb_sex_SelectedIndexChanged);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
this.dgv_type.Controls.Add(cmb_sex);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void BindType()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string tempStrSQL = "select Sex from Sex";
tempDataTable = link.SelectDataBase(tempStrSQL);
for (int i = 0; i < tempDataTable.Rows.Count; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//将Sex中性别字段传给Combobox
this.cmb_sex.Items.Add(tempDataTable.Rows[i][0]);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private void dgv_type_CurrentCellChanged(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (this.dgv_type.CurrentCell.ColumnIndex == 2)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Rectangle rect = dgv_type.GetCellDisplayRectangle(dgv_type.CurrentCell.ColumnIndex, dgv_type.CurrentCell.RowIndex, false);
cmb_sex.Left = rect.Left;
cmb_sex.Top = rect.Top;
cmb_sex.Width = rect.Width;
cmb_sex.Height = rect.Width;
cmb_sex.Visible = true;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cmb_sex.Visible = false;
}
}
private void cmb_sex_SelectedIndexChanged(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (((ComboBox)sender).Text.Trim() == "男")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.CurrentCell != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dgv_type.CurrentCell.Value = "男";
dgv_type.CurrentCell.Tag = "1";
}
}
if (((ComboBox)sender).Text.Trim() == "女")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.CurrentCell != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dgv_type.CurrentCell.Value = "女";
dgv_type.CurrentCell.Tag = "2";
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private void dgv_type_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
for (int i = 0; i < this.dgv_type.Rows.Count; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (dgv_type.Rows[i].Cells[1].Value != null && dgv_type.Rows[i].Cells[1].ColumnIndex == 1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Tag = dgv_type.Rows[i].Cells[1].Value.ToString();
if (dgv_type.Rows[i].Cells[1].Value.ToString() == "1")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Value = "男";
}
else if (dgv_type.Rows[i].Cells[1].Value.ToString() == "2")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
dgv_type.Rows[i].Cells[1].Value = "女";
}
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private void btn_save_Click(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string tempStrSQL;
//rowMax为当前DataGridView中最大行号
for (int i = rowMax; rowMax < this.dgv_type.Rows.Count; rowMax++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (this.dgv_type.Rows[rowMax].Cells[0].Value == null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
break;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string ID = dgv_type.Rows[rowMax].Cells[0].Value.ToString().Trim();
string Name = dgv_type.Rows[rowMax].Cells[1].Value.ToString().Trim();
string Sex = dgv_type.Rows[rowMax].Cells[2].Value.ToString().Trim();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
string sendValues = "('" + ID + "','" + Name + "','" + Sex + "')";
tempStrSQL = "insert Name (ID,Name,Sex) values " + sendValues;
link.UpdateDataBase(tempStrSQL);
}
}
MessageBox.Show("保存成功", "信息");
}
}
}
最后的效果
![]()
第一次写这种东西,写的方法很笨,只是用做交流,同时也希望得到指教。大家共同努力!