datagridview单元格在Windows窗体中编辑和保存function?

我在c#windows窗体应用程序中处理datagridview,我正在从数据库加载数据,现在我希望用户能够编辑单元格值并将值保存到数据库,如何编辑单元格值和如何将值保存到数据库?

SqlConnection con = new SqlConnection("user id=sa;password=123;database=employee"); SqlDataAdapter da = new SqlDataAdapter("select * from UserReg", con); DataSet ds = new DataSet(); da.Fill(ds, "p"); dataGridView1.DataSource = ds.Tables["p"]; 

使用DataGridView更新数据库的方法之一是使用DataGridView的事件:

 DataGridView.CellBeginEdit DataGridView.CellValidating DataGridView.CellEndEdit 

让我们说: private DataGridView dgv; 添加事件处理程序

 dgv.CellBeginEdit += dgv_CellBeginEdit; dgv.CellValidating += dgv_CellValidating; dgv.CellEndEdit += dgv_CellEndEdit; private void dgv_CellBeginEdit(Object sender, DataGridViewCellCancelEventArgs e) { //Here we save a current value of cell to some variable, that later we can compare with a new value //For example using of dgv.Tag property if(e.RowIndex >= 0 && e.ColumnIndex >= 0) { this.dgv.Tag = this.dgv.CurrentCell.Value; //Or cast sender to DataGridView variable-> than this handler can be used in another datagridview } } private void dgv_CellValidating(Object sender, DataGridViewCellValidatingEventArgs e) { //Here you can add all kind of checks for new value //For exapmle simple compare with old value and check for be more than 0 if(this.dgv.Tag = this.dgv.CurrentCell.Value) e.Cancel = true; //Cancel changes of current cell //For example used Integer check int32 iTemp; if (Int32.TryParse(this.dgv.CurrentCell.Value, iTemp) = True && iTemp > 0) { //value is ok } else { e.Cancel = True; } } Private Sub dgvtest1_CellEndEdit(Object sender, DataGridViewCellEventArgs e) { //Because CellEndEdit event occurs after CellValidating event(if not cancelled) //Here you can update new value to database } 

尝试这样做:

  private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { //after you've filled your ds, on event above try something like this try { da.Update(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 

我使用OleDb,但你可以使用SQL。 这是我通常用于相同的代码。

 OleDbCommand sCommand; OleDbDataAdapter sAdapter; OleDbCommandBuilder sBuilder; OleDbConnection connection; DataSet sDs; DataTable sTable; string myMode = ""; private void BtnLoad_Click(object sender, EventArgs e) { string query = "SELECT * FROM [Table]"; connection = new OleDbConnection(connectionString); connection.Open(); sCommand = new OleDbCommand(query, connection); sAdapter = new OleDbDataAdapter(sCommand); sBuilder = new OleDbCommandBuilder(sAdapter); sDs = new DataSet(); sAdapter.Fill(sDs, "Table"); sTable = sDs.Tables["Table"]; connection.Close(); DataGrid.DataSource = sTable; DataGrid.ReadOnly = true; DataGrid.SelectionMode = DataGridViewSelectionMode.FullRowSelect; } private void BtnAdd_Click(object sender, EventArgs e) { DataGrid.ReadOnly = false; myMode = "add"; } private void BtnEdit_Click(object sender, EventArgs e) { DataGrid.ReadOnly = false; myMode = "edit"; } private void BtnDelete_Click(object sender, EventArgs e) { myMode = ""; if (MessageBox.Show("Do you want to delete this row ?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { DataGrid.Rows.RemoveAt(DataGrid.SelectedRows[0].Index); sAdapter.Update(sTable); } } private void BtnSave_Click(object sender, EventArgs e) { if (myMode == "add") { sAdapter.Update(sTable); MessageBox.Show("Prices Are Successfully Added.", "Saved.", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); } else if (myMode == "edit") { string query = "UPDATE Table_Name SET " + "Column1 = '" + DataGrid.SelectedRows[0].Cells[0].Value.ToString() + "' ," + "Column2 = " + DataGrid.SelecteddRows[0].Cells[1].Value.ToString() + ", " + "WHERE CONDITION"; connection = new OleDbConnection(connectionString); connection.Open(); sCommand = new OleDbCommand(query, connection); sAdapter = new OleDbDataAdapter(sCommand); sBuilder = new OleDbCommandBuilder(sAdapter); sDs = new DataSet(); sAdapter.Fill(sDs, "Table"); sTable = sDs.Tables["Table"]; connection.Close(); DataGrid.DataSource = sTable; DataGrid.ReadOnly = true; } } 

看看DataGridView事件列表。 您需要订阅相应的事件,并相应地处理它。 也就是说,您对DataGridView.CellValueChanged感兴趣。

 dataGridView1.CellValueChanged += ValueChangedHandler; private void ValueChangedHandler(object sender, DataGridViewCellEventArgs e) { // do what is appropriate here. } 

添加此行代码以启用对datagridview的编辑

 dtg.EditMode = DataGridViewEditMode.EditOnKeystroke; 

然后使用下面的事件

 private void dtg_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (e.ColumnIndex > -1 && e.RowIndex > -1) { dtg.ReadOnly = false; } } 

以上两个事件将启用datagridview中的编辑。

然后使用下面的事件将更新的数据保存回db。

 private void dtg_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; }