dt.PrimaryKey=new DataColumn[]{dt.Columns["会员名"]};
//在MainForm里定义了会员名是主键,在数据源里会员名也是主键。
DataRow Dr = _MainForm.dt.NewRow();//把MainForm类做为构造函数的参数传给子窗体,这样添加
Dr[0] = "";
Dr[1] = textBox1.Text
_MainForm.dt.Rows.Add(Dr);
_MainForm._OleDa.Update(_MainForm._DataSet,"MyDataTable");
for(int i=0;i<_MainForm.dt.Columns.Count;i++)
_ArrayList.Add(_MainForm.drv[i].ToString());//drv是当前行的视图DataRow dr = _MainForm.dt.Rows.Find(_ArrayList[1]);//这个是修改
Find()这个方法的参数一定得是主键列嘛,换别的就出错。
dr[1] = textBox1.Text;
_MainForm._OleDa.Update(_MainForm._DataSet,"MyDataTable");
还有添加主键列出现了重复,catch的时候是哪个错误唉,问题太多了。真是不好意思太多了。
textBox1.Text = _ArrayList[1].ToString();
textBox2.Text = _ArrayList[2].ToString();
textBox3.Text = _ArrayList[3].ToString();
textBox4.Text = _ArrayList[4].ToString();
textBox5.Text = _ArrayList[5].ToString();//这能不能写出个循环

解决方案 »

  1.   

    DataRow dr = _MainForm.dt.Rows.Find(_ArrayList[1]);//这个是修改
    Find()这个方法的参数一定得是主键列嘛,换别的就出错。
    ===========
    是需要主键,
    不过你可以通过DataTable.Select()方法来过滤,如:
    strExpr = "id = 123456";
    DataRow[] foundRows = myTable.Select(strExpr);附值那一部分没有什么好办法,
    1.除非使用反射,不过这样会得不赏失。
    2.如果那些TextBox放在一个父控件件中,而且根据命名按顺序添加到父控件容器的,那可以通过循环来附值。
    大概如下;
    int i = 0;
    foreach(Control c in ParentControl.Controls)
    {
       TextBox t = c as TextBox;
       if(t != null)
       {  
          t.Text = arrayList[i];
          i++;
          if(i >= arrayList.Count)
           break;
       }
    }
    3.你也可以把需要赋值的TextBox,按顺序组成一个TextBox[]数组。这样循环赋值就比较方便了。
      

  2.   

    对于组件冲突,你这里的会员名应该是字符串的吧,这里可以在添加新DataRow 之前,
    _MainForm.dt.Rows.Add(Dr);在dt 先查一下是否存在新Dr["name"],如果存在就提示用户已存在,如果不存在就直接Add了。查找是不是存在行可以通过,myTable.Select(strExpr);

    _MainForm.dt.Rows.Find(_strExpr);注意上面的方法针对一个用户来操作没有问题,如果是多用户操作,那就需要在数据库那一层进行判断。更新时解决冲突比较好的办法就是把两条数据显示到界面上让用户选择,当然你也可以制定一些规则。
    如果主键是整型自增长的,那就没有这么麻烦了。
      

  3.   

    dataset的数据源有主键,在datagrid里新加一条时,这个主键列出错。老大,还有这个方法呢,给贴出来呗。
      

  4.   

    数据库自增长解决,
    =========================
    DataColumn dc = dt.Columns["id"];//这一列对应的数据库中的表字段是自增列,
    在内存DataTable中进行批输入更新时不能马上得到新输入的上一条记录的主键,
    所以建立临时唯一主键如下:
    dc.AutoIncrement = true;//设置该列为自增长,
    dc.AutoIncrementSeed = -1;//新增列的初始值。
    dc.AutoIncrementStep = -1;//列的值自动递增的数值。默认为 1。
    这样你添加第一条新增数据的时候临时主键为-1,
    第二条为-2,
    ...
    在使用DataAdapter.Update(dt);进行更新的时候,
    如果数据源是Sql Server那使用存储过程输出参数把自增主键输出会自动更新新增的DataRow,
    比如上面的-1,-2,-3等自动会更新成实际数据库中的自增主键值。
    这种方式具体可以看我的一片文章,
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
    如果是Access或其他数据库就有点麻烦,回填实现如下:
    注册DataAdapter.RowUpdated事件。
    da.RowUpdated += new OleDbRowUpdatedEventHandler(da_RowUpdated);
    事件处理程序,
    private static void da_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
    {
    if(e.Status == UpdateStatus.Continue && e.StatementType = StatementType.Insert)
    {
    OleDbConnection conn = new OleDbConnection("连接字符串");
    OleDbCommand comm = new OleDbCommand("SELECT @@IDENTITY",conn);
    conn.Open();
    e.Row["id"] = (int)comm.ExecuteScalar();//得到最新递增值更新到内存DataTable中刚更新的DataRow.
    e.Row.AcceptChanges();
    conn.Close();
    }
    }
    //处理程序中的每次生成conn,和comm没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。