这是我七改八改写出的代码,虽然现在没有出错,但总觉得思维有点混乱!
我想实现的功能是,当在DataGridView输入修改数据时能自动提交到数据库,右键可以删除当前行数据!
我用了两个事件一个是CellBeginEdit,另一个是CellEndEdit.
这里有个难点是在CellEndEdit中,当前行无法判断是不是新增的!于是我就在CellBeginEdit事件中设置一个变量用来记录是不是新增,请看代码,有没有更好的实现的方法呢? public partial class CPModel : Form
{
private DataSet myDS;
private bool isNesRow = false;
private OleDbConnection conn=null;
private OleDbDataAdapter da = null;
private void binddata()
{
conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=F:/CPDB.mdb");
conn.Open();
string sql = "select * from OriginData";
da = new OleDbDataAdapter(sql, conn);
myDS = new DataSet();
da.Fill(myDS,"OD");
this.dataGridView1.DataSource = myDS.Tables["OD"].DefaultView;
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridView1.RowHeadersVisible = false;
myDS.AcceptChanges();
}
public CPModel()
{
InitializeComponent();
binddata();
}
private void dataGridView1_CellBeginEdit(object sender,DataGridViewCellCancelEventArgs e)
{
if (this.dataGridView1.CurrentRow.IsNewRow)
{
isNesRow = true;
}
} private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (myDS.HasChanges())
{
for (int i = 0; i < myDS.Tables[0].Columns.Count; i++)
{
if (string.IsNullOrEmpty(myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index][i].ToString()))
{
myDS.RejectChanges();
return;
}
}
if (this.dataGridView1.CurrentRow.Index>=myDS.Tables[0].Rows.Count-1 && isNesRow)
{
da.InsertCommand = conn.CreateCommand();
da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
int count = da.Update(myDS, "OD");
bool result = count > 0 ? true : false;
}
else
{
isNesRow = false;
OleDbParameter sp = new OleDbParameter();
da.UpdateCommand = conn.CreateCommand();
da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
sp.SourceVersion = DataRowVersion.Original;
int count = da.Update(myDS, "OD");
bool result = count > 0 ? true : false;
}
}
} private void CutCurRowMenuItem_Click(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentRow != null && this.dataGridView1.CurrentRow.Index<=myDS.Tables[0].Rows.Count-1)
{
OleDbParameter sp = new OleDbParameter();
da.DeleteCommand = conn.CreateCommand();
da.DeleteCommand.CommandText = "delete from OriginData where Phases=@Phases";
sp = da.DeleteCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
sp.SourceVersion = DataRowVersion.Original;
myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index].Delete();
int count = da.Update(myDS,"OD");
bool result = count > 0 ? true : false;
}
} private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (e.RowIndex >= 0)
{
if (this.dataGridView1.Rows[e.RowIndex].Selected == false)
{
this.dataGridView1.ClearSelection();
this.dataGridView1.Rows[e.RowIndex].Selected = true;
}
if (this.dataGridView1.SelectedRows.Count == 1)
{
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
this.UserMenu.Show(MousePosition);
}
}
}
}
我想实现的功能是,当在DataGridView输入修改数据时能自动提交到数据库,右键可以删除当前行数据!
我用了两个事件一个是CellBeginEdit,另一个是CellEndEdit.
这里有个难点是在CellEndEdit中,当前行无法判断是不是新增的!于是我就在CellBeginEdit事件中设置一个变量用来记录是不是新增,请看代码,有没有更好的实现的方法呢? public partial class CPModel : Form
{
private DataSet myDS;
private bool isNesRow = false;
private OleDbConnection conn=null;
private OleDbDataAdapter da = null;
private void binddata()
{
conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=F:/CPDB.mdb");
conn.Open();
string sql = "select * from OriginData";
da = new OleDbDataAdapter(sql, conn);
myDS = new DataSet();
da.Fill(myDS,"OD");
this.dataGridView1.DataSource = myDS.Tables["OD"].DefaultView;
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridView1.RowHeadersVisible = false;
myDS.AcceptChanges();
}
public CPModel()
{
InitializeComponent();
binddata();
}
private void dataGridView1_CellBeginEdit(object sender,DataGridViewCellCancelEventArgs e)
{
if (this.dataGridView1.CurrentRow.IsNewRow)
{
isNesRow = true;
}
} private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (myDS.HasChanges())
{
for (int i = 0; i < myDS.Tables[0].Columns.Count; i++)
{
if (string.IsNullOrEmpty(myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index][i].ToString()))
{
myDS.RejectChanges();
return;
}
}
if (this.dataGridView1.CurrentRow.Index>=myDS.Tables[0].Rows.Count-1 && isNesRow)
{
da.InsertCommand = conn.CreateCommand();
da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
int count = da.Update(myDS, "OD");
bool result = count > 0 ? true : false;
}
else
{
isNesRow = false;
OleDbParameter sp = new OleDbParameter();
da.UpdateCommand = conn.CreateCommand();
da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
sp.SourceVersion = DataRowVersion.Original;
int count = da.Update(myDS, "OD");
bool result = count > 0 ? true : false;
}
}
} private void CutCurRowMenuItem_Click(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentRow != null && this.dataGridView1.CurrentRow.Index<=myDS.Tables[0].Rows.Count-1)
{
OleDbParameter sp = new OleDbParameter();
da.DeleteCommand = conn.CreateCommand();
da.DeleteCommand.CommandText = "delete from OriginData where Phases=@Phases";
sp = da.DeleteCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
sp.SourceVersion = DataRowVersion.Original;
myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index].Delete();
int count = da.Update(myDS,"OD");
bool result = count > 0 ? true : false;
}
} private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (e.RowIndex >= 0)
{
if (this.dataGridView1.Rows[e.RowIndex].Selected == false)
{
this.dataGridView1.ClearSelection();
this.dataGridView1.Rows[e.RowIndex].Selected = true;
}
if (this.dataGridView1.SelectedRows.Count == 1)
{
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
this.UserMenu.Show(MousePosition);
}
}
}
}
解决方案 »
- VS2010新建WPF应用加载错误的问题
- 如何抓取AJAX方法产生的内容?
- 比如,有一个Text1, button1,button2,button3,button4怎么样设置button4为按回车后自动触发的事件的button按钮呢
- 为什么窗体没有事件也可以结果为OK
- Between ?? .net 竟然不支持 寻求解决方案
- 关于.NET多线程嵌套的管理问题
- Timer控件的Tick与Elapsed事件有什么区别?
- 问几个经常碰到的问题。dataGrid如何实现删除、编辑、添加的功能!!
- CMPP协议长短信问题
- 求教asp.net问题,求大神啊,关于for循环中传递值的问题
- C#button怎么调用方法。
- C#的配置文件处理
而且,dataset本身有批量修改的功能,即直接对绑定的dataset的DataGridView中数据进行修改,修改完毕后,整体提交即可,为什么要这么麻烦?
=======================================================
.NET快速开发整合框架(RDIFramework.NET),基于.NET的快速开发、整合框架,给用户和开发者最佳的.Net框架部署方案。
平台博客:[CNBLOGS]http://www.cnblogs.com/huyong
[CSDN]http://blog.csdn.net/chinahuyong
交流QQ:406590790 (请注明:CSDN)
平台微博:http://t.qq.com/yonghu86
邮件交流:[email protected]
我这里有个难点,就是如何判断修改的行是新增的还是原来就有的?新增的话就要用insert,修改的话就要用UPDATE,我是用CellBeginEdit事件来做标记,DataGridVIEW本身有个IsNewRow属性,但这个标志在这里就不能判断了。
return;
int index=dataGridView1.CurrentCell.RowIndex;
if (dataGridView1.Rows[index].IsNewRow)
{
}
{
if (dataGridView1.CurrentCell == null)
return;
DataRowView item = (DataRowView)dataGridView1.Rows[e.RowIndex].DataBoundItem;
if (item.IsNew)
{
}
}
现在不用判断是不是新增了,OleDbDataAdapter会自动判断!
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (myDS.HasChanges())
{
for (int i = 0; i < myDS.Tables[0].Columns.Count; i++)
{
if (string.IsNullOrEmpty(myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index][i].ToString()))
{
myDS.RejectChanges();
return;
}
}
da.InsertCommand = conn.CreateCommand();
da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
OleDbParameter sp = new OleDbParameter();
da.UpdateCommand = conn.CreateCommand();
da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
sp.SourceVersion = DataRowVersion.Original;
int count = da.Update(myDS, "OD");
bool result = count > 0 ? true : false;
}
}