通过dataGridView更新数据库
系统要求,使用DataGridView控件直接修改数据库中的内容。编程语言C#,数据使用MSSQL
使用一个简单的界面
启动文件Program.cs内容如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace datagridview改变内容事件
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
主程序内容如下Form1.cs:
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;
using System.Data.SqlClient;
namespace datagridview改变内容事件
{
public partial class Form1 : Form
{
/*
* 程序要完成的功能是:手动修改datagridview中的数据,
* 挡它失去焦点后系统会将修改过的内空回定的数据库中。
*
* 思路:
* 1、将数据表的结构记录到一个一维数组中用于保存字段名
* 2、设定一个变量用于记录当前数据库中的记录条数
* 3、定义一个类rows用于存放修改的一行信息。
* 4、定义一个List<rows>用于记录所有修改过的行
* 4、控件失去焦点后循环写入数据库中
*/
SqlConnection cnn = new SqlConnection(); //定义一个数据库的连接器
string[] myColumns; //记录数据库的表结构
int iCount = 0; //记录当前数据库中的记录行数
//定义一个类,用于存放一行被修改过的单位列表
class rows
{
private int _row;//行号
private List< int> _columns;//列的列表,可变长度
public rows(int row, List<int> columns)
{
this._row = row;
this._columns = columns;
}
public int row
{
get { return _row; }
}
public List<int> columns
{
get { return _columns; }
}
}
List<rows> myCells=new List<rows> ();//定义一个容器存放被修改过的行列地址
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string MyConnString = "";
MyConnString = "Data Source=192.168.1.180 ; Initial Catalog=gzyoa;User ID=sa ; Password=*******";//这里定义一个数据连接
if (cnn.State == ConnectionState.Open)
{
cnn.Close();
}
cnn.ConnectionString = MyConnString;
cnn.Open(); //打开数据库的连接
myColumns = new string[2]; //将数据表的结构存放到一个数组中
myColumns[0] = "P_TID"; //这个ID是关键字
myColumns[1] = "P_Title";
//以下是从数据库中获取数据到datatable中
string str = "SELECT P_TID as 序号, P_Title as 名称 FROM P_Title";
DataTable myTab = new DataTable();
SqlCommand sqlcmd = new SqlCommand(str, cnn);
SqlDataAdapter myAdp = new SqlDataAdapter();
myAdp.SelectCommand = sqlcmd;
myAdp.Fill(myTab);
iCount = myTab.Rows.Count;//记录原始数据库中的记录数,以更判断是新增数据还是原有的数据
dataGridView1.DataSource = myTab;//数据绑定的datagridview上
}
//当单元格内容发生变化后触发此函数
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
int iRow=0;//行记数器
bool findSameColumn = false;//当找到重复“单位格”时设置此标志
bool findSameRow = false;//当发现有相同“行”时设置此标志
foreach (rows c in myCells)
{
//如果发现重复的行
if (c.row == e.RowIndex)
{
findSameRow = true;
//查找有没有重复的列
foreach (int ci in myCells[iRow].columns)
{
if (ci == e.ColumnIndex)
{
//重复单元,不用记录
findSameColumn = true;
break;
}
}
if (!findSameColumn)
{
//行重复,但列不重复添加数据
myCells[iRow].columns.Add(e.ColumnIndex);
}
}
iRow++;
}
if (!findSameRow)
{
//没有找到相行数据,说明是新行
List<int> col = new List<int>();
col.Add(e.ColumnIndex);
rows c1 = new rows(e.RowIndex,col);
myCells.Add(c1);
}
}
//自定义一个更新数据库的函数
private void ChangeDatabase()
{
if (myCells.Count > 1)
{
int i=0;
string strSet = "";
foreach (rows r in myCells)
{
//判断当前行是否超出记录数,如果超出,说明是新增记录
if (r.row >= iCount)
{
string str = "insert into P_Title(";
string rowsname = myColumns [0];
//循环读取这一行中所有被修改的单位格“列”地址
for (int j = 1; j < myColumns.Length; j++)
{
rowsname += "," + myColumns[j];
}
str += rowsname + ") VALUES (" + dataGridView1.Rows[r.row].Cells[0].Value.ToString()+"'" ;
string col="";
for (int j = 1; j < myColumns.Length; j++)
{
col += "','" + dataGridView1.Rows[r.row].Cells[j].Value.ToString()+"'";
}
str += col + ")";
SqlCommand myCom = new SqlCommand(str, cnn);
int lines = myCom.ExecuteNonQuery();
}
else
{
foreach (int ci in myCells[i].columns)
{
strSet +=","+ myColumns[ci] + "='" + dataGridView1.Rows[r.row].Cells[ci].Value.ToString()+"'";
}
strSet = strSet.Substring(1);
string str = "update P_Title set " + strSet + "where " + myColumns[0] + "='" + dataGridView1.Rows[r.row].Cells[0].Value.ToString()+"'";
SqlCommand myCom = new SqlCommand(str, cnn);
int lines = myCom.ExecuteNonQuery();
}
//string str="update P_Title set "+myColumns[
i++;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
ChangeDatabase();
}
}
}
界面生成文件Form1.Designer.cs是系统自动生成的
namespace datagridview改变内容事件
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.panel1 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// dataGridView1
//
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(0, 0);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.RowTemplate.Height = 23;
this.dataGridView1.Size = new System.Drawing.Size(648, 368);
this.dataGridView1.TabIndex = 0;
this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellValueChanged);
//
// panel1
//
this.panel1.Controls.Add(this.button1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 368);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(648, 64);
this.panel1.TabIndex = 1;
//
// button1
//
this.button1.Location = new System.Drawing.Point(37, 15);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "更新数据库";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(648, 432);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button button1;
}
}