双击datagridview任一单元格,弹出另外一个窗体,如何修改数据呢?

skylinlovekiro 2007-06-27 11:54:25
我双击datagridview 事件的代码是这样的:
private void BookList_DoubleClick(object sender, EventArgs e)
{
int ID;
ID = BookList.CurrentCell.RowIndex;
Form2 form=new Form2();
DataTable dt = new DataTable();
dt = (DataTable)BookList.DataSource;
form.txtBookId.Text= dt.Rows[ID]["图书编号"].ToString();
form.txtBookName.Text = dt.Rows[ID]["书名"].ToString();
form.txtPrice.Text = dt.Rows[ID]["价格"].ToString();
form.cbType2.DataSource = (new BookCategory()).GetBookType();
form.cbType2.DisplayMember = "BookType";

form.ShowDialog();
}

之后弹出修改数据的窗体,试问怎么写代码进行修改并更新呢?这个窗体的代码是这样的:
Form1 form = new Form1();
int index = form.ID;//把form窗体的索引ID赋给index,这代码这样写可以吗??我试了,好象窗体过来的ID是0,也就是说那个索引值没有传递过来。
DataTable dt = new DataTable();
dt = (DataTable)form.BookList.DataSource;
dt.Rows[index]["图书编号"] = txtBookId.Text;
dt.Rows[index]["书名"] = txtBookName.Text;
dt.Rows[index]["价格"] = txtPrice.Text;
dt.Rows[index]["图书类型"] = cbType2.Text;

(new Dac()).UpdateData();

提示说“未将对象引用设置到对象的实例”
我很困惑,我想怎么把主窗体里的那个单元格索引ID直接传递到修改数据的窗体呢?
...全文
855 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
aying996 2007-06-28
  • 打赏
  • 举报
回复
窗体间的操作 一般都要传值的,你也可以把form1直接传过去,都可以的.
aying996 2007-06-28
  • 打赏
  • 举报
回复
private void BookList_DoubleClick(object sender, EventArgs e)
{
int ID;
ID = BookList.CurrentCell.RowIndex;
Form2 form=new Form2(this.ID);//--------这里传值---------------
DataTable dt = new DataTable();
dt = (DataTable)BookList.DataSource;
form.txtBookId.Text= dt.Rows[ID]["图书编号"].ToString();
form.txtBookName.Text = dt.Rows[ID]["书名"].ToString();
form.txtPrice.Text = dt.Rows[ID]["价格"].ToString();
form.cbType2.DataSource = (new BookCategory()).GetBookType();
form.cbType2.DisplayMember = "BookType";

form.ShowDialog();
--------------------------------------------------
//变量
int index=0;
//----------- 构造函数
Form2(int ID)
{
index=ID
}
//------------下面这段不要----------------------------------
Form1 form = new Form1();
int index = form.ID;//把form窗体的索引ID赋给index,这代码这样写可以吗??我试了,好象窗体过来的ID是0,也就是说那个索引值没有传递过来。
//------------------------------------------------------------------
DataTable dt = new DataTable();
dt = (DataTable)form.BookList.DataSource;
dt.Rows[index]["图书编号"] = txtBookId.Text;
dt.Rows[index]["书名"] = txtBookName.Text;
dt.Rows[index]["价格"] = txtPrice.Text;
dt.Rows[index]["图书类型"] = cbType2.Text;

(new Dac()).UpdateData();
}
//注:你重新实例了Form1 form = new Form1();
//就是说:Form1已经不是你希望得到的Form1了,已经被重新实例了```
skylinlovekiro 2007-06-28
  • 打赏
  • 举报
回复
谢谢楼上的提醒。我是个初学者。还有哪个高手可以稍微指点下迷津呢?
namhyuk 2007-06-28
  • 打赏
  • 举报
回复
.net 2.0 winform记得一定注意好好利用BindingSource.
楼主问题我基本没看,但这种问题没有用到BindingSource,就等于说楼主在.net 2.0 winform方面缺一个非常基本,而且重要的知识点。


神奇的章鱼哥 2007-06-28
  • 打赏
  • 举报
回复
在form2里用属性给出返回值
在form1双击事件中ShowDialog后取这个属性进行更新
So Easy
aying996 2007-06-28
  • 打赏
  • 举报
回复
没有理我,真是太伤心了```

你这个肯定是窗体被重新实例了所以得到的 ID = BookList.CurrentCell.RowIndex; 这个已经不是你上一个窗体的数据了``

如果在from2修改form1的数据 你就不能重新实例form1
最直接的办法就是 在实例form2的时候 把 form1传递给form2```
给你看一段代码你就明白了

----------------------------------------------------------
//form1代码
public dataGridView BookList=new dataGridView();//一定要公共的才行
`````````````````````````````
`````````````
`````````````````````
form2 frm2=new form2(this);
frm2.showDialog();

//form2代码
private form1 recFrm1;
private ID;
public form2(form1 frm)
{
this.recFrm1=frm;
}
//在这里写提交按纽的代码
private void BtnClick((object sender, EventArgs e)
{
ID = BookList.CurrentCell.RowIndex;
//你只要修改数据源,对应的form1的dataGridView的数据就自动更新了
}
skylinlovekiro 2007-06-28
  • 打赏
  • 举报
回复
谢谢LS的。但是我试了下,好象不行。。
private void BookList_DoubleClick(object sender, EventArgs e)
{
int ID;
ID = BookList.CurrentCell.RowIndex;
Form2 form=new Form2(); //弹出窗体FORM2,修改数据
DataTable dt = new DataTable();
dt = (DataTable)BookList.DataSource;
form.txtBookId.Text= dt.Rows[ID]["图书编号"].ToString();
form.txtBookName.Text = dt.Rows[ID]["书名"].ToString();
form.txtPrice.Text = dt.Rows[ID]["价格"].ToString();
form.cbType2.DataSource = (new BookCategory()).GetBookType();
form.cbType2.DisplayMember = "BookType";

form.ShowDialog();
}
上面是我双击DATAGRIDVIEW的代码,双击之后弹出窗体FORM2,那现在如何在FORM2里修改数据并更新,我给出的FORM2代码大家可以忽略,然后给出你们觉得可行的代码或是方案。谢谢先了
YUAN168 2007-06-28
  • 打赏
  • 举报
回复
bookList是否你的DataGridView?
bindSource.dataSource=datatable;
bookList.dataSource=Bindsource;

private void BookList_DoubleClick(object sender, EventArgs e)
{
dataRow CurrentRow=this.dataTable.rows[this.bindsource.position];
form2 frm=new form2(dataRow);//此处传递DataRow参数过去!
第一种情况:在Form2修改后直接保存:
直接使用SQL语句执行
Save()
{
string sql="update table set .......";
sqlcommand sqlcmd=net sqlcommand(sql,myconn);
myconn.open();
sqlcmd.executenonquery();
myconn.close();
}

第二种情况:将修改后的数据传加到第一个窗体中,使用委托
public delegate void DelegateEventDate(DataRow selectedDataRow);

form2:
public event DelegateEventDate SelectDate;
//下面是要传回到第一个窗体了....
private void btnOK_Click(object sender, EventArgs e)
{
this.SelectDate(刚才传入的那一行);
this.Close();
}

第一个窗体:
private void BookList_DoubleClick(object sender, EventArgs e)
{
dataRow CurrentRow=this.dataTable.rows[this.bindsource.position];

form2 frm=new form2(dataRow);//此处传递DataRow参数过去!
frm.SelectDate += new DelegateEventDate(GetReturnDate);
....

}

private void GetReturnDate(DataRow dr)
{
// this.currentRowMaster["id_emp"] = dr["id_hdm2emp"];
// this.currentRowMaster["no_emp"] = dr["工号"];
////this.currentRowMaster["nm_emp"]=dr["姓名"];
// this.txtEmpno.Text = Convert.ToString(dr["工号"]);
// this.txtEmpName.Text = Convert.ToString(dr["姓名"]);
}






110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧