询问者
DataAdapter的Update问题

问题
-
我用两个窗体,Form1中有DGV,Form2是修改dt的表单(所有控件已绑定dt的列)。问题是在Form2里调用da的Update方法为什么只能更新dt,但不能更新数据库?但在Form1调用Update却可以更新数据库。这是为什么?如何在Form2点击Save按钮后让数据库和DGV及时更新?
//在Form1里
public static DataTable dt = new DataTable();
public static SqlDataAdapter da = new SqlDataAdapter();
public static DataSet ds = new DataSet();.......链接数据库和通过da填充DGV的数据.......
private void btnSave_Click(object sender, EventArgs e)
{da.Update(dt); //可以更新数据库和DGV
}
//在Form2里
private void btnSave_Click(object sender, EventArgs e)
{Form1.da.Update(Form1.dt); //可以更新dt,但不能更新数据库。关闭Form2,DGV聚焦后可以更新DGV。
}
全部回复
-
>>可能我说得不清楚,我的意思是DGV在Form1,从Form1打开Form2修改数据。Form2是特别用来增删改数据的表单,我的目的是增删改后直接在Form2点击Save按钮就可更新数据库。
那么你设法把dt绑定到Form2的TextBox上,比如:
TextBox1.DataBindings.Add("Text",Form1.dt,"ColumnName");
这样你先从dataGridView中选中一条dataGridView(把dataGridView的SelectMode改为FullRowSelect),然后打开Form2,在TextBox1中修改数据,最后点击Form2上的更新,最后退回到Form1,重新从数据库中选取全部数据填充数据到新的DataTable,然后绑定到dataGridView即可。
-
Sorry……
您这样做……
1)在Form2中为Form1定义一个带参数的构造函数,把Form1实体直接引入到里边以便直接更新:
public class Form2:Form { ……………… private Form1 Form1{get;set;} public Form2(Form1 frm):this() { Form1 = frm; } //然后调用form1中静态方法之后直接使用: Form1.dataGridView = Form1.DataTable啥的…… } //注意Form1中调用新的Form2实体时候—— Form2 frm2 = new Form2(this); frm2.ShowDialog();
- 已编辑 ThankfulHeartModerator 2012年6月24日 4:24
-
太麻烦您了!现在我把代码简化以方便讨论。以下是Form1和Form2的视图和代码,请您试试看(只须改用您的数据库而已)。我的目的是按下Form2的Save按钮后就能把变更存于数据库,同时DGV也立刻反映变更后的数据。以下代码执行时一切正常,只是不能把变更存储于数据库而已。注:“NamaSupplier”是印尼文,英语是“SupplierName”。
//Form1类代码
public partial class Form1 : Form
{
public static DataTable dtSupplier = new DataTable();
public static SqlDataAdapter da = new SqlDataAdapter();
public static DataSet ds = new DataSet();
public static DataView dv = new DataView();public Form1()
{
InitializeComponent();
string strConn = "Data Source=.\\xpw;Initial Catalog=EasyMeal;
Integrated Security=True;";
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
string sqlSupplier = "SELECT * FROM supplier";da = new SqlDataAdapter(sqlSupplier, conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
da.Fill(ds, "supplier");
dtSupplier = ds.Tables["supplier"];
dgv.DataSource = dtSupplier;
dv = dtSupplier.DefaultView;
}private void btnSave_Click(object sender, EventArgs e)
{
Form1.da.Update(Form1.dtSupplier);
}private void btnShowForm2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2(this);
frm2.ShowDialog();
}
}//Form2类代码
public partial class Form2 : Form
{
private Form1 f1 { get; set; }
public BindingSource bsSupplier;public Form2(Form1 frm)
{
InitializeComponent();
f1 = frm;
bsSupplier = new BindingSource();
bsSupplier.DataSource = Form1.ds.Tables["supplier"];
textBox1.DataBindings.Add("Text", Form1.dtSupplier, "NamaSupplier");
}public Form2()
{
InitializeComponent();
}
} -
public partial class Form2 : Form { private Form1 f1 { get; set; } public Form2(Form1 frm) { InitializeComponent(); f1 = frm; textBox1.DataBindings.Add("Text", Form1.dtSupplier, "NamaSupplier"); } public Form2() { InitializeComponent(); } //假设有一个Update按钮 private void Update_Click(object sender,EventArgs e) { f1.Update方法…… f1.dataGrid1.Datasource = f1.dtSupplier; //把dataGrid1设置成public或者internal即可。 this.Close(); } }