private void tvResources_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
///根据选定状态为条件修改权限
///
if(flag)
{
DataRowView rowCategory = this.BindingContext[this.dsCategory, this.dsCategory.Tables[0].TableName].Current as DataRowView;
string categoryid = rowCategory["C_CATEGORYID"].ToString();
string resourceid = ((Subject)e.Node.Tag).data["C_RESOURCEID"].ToString();
//string resourceid =((Subject)tvResources.SelectedNode.Tag).data["C_RESOURCEID"].ToString();
DataSet dsGrant1=DataBaseAgent.GetDataFromDB("select c_categoryid,c_subjectid,c_resourceid from TR_GRANT");//(DataBaseAgent.ORACLECONNECTSTRING,"select * from tr_grant");

if(e.Node.Checked)
{
//添加指定权限
DataRow rowGrant1= dsGrant1.Tables[0].NewRow();
//rowGrant.BeginEdit();
rowGrant1["c_categoryid"] = categoryid;
rowGrant1["c_subjectid"] = subjectno;
rowGrant1["c_resourceid"] = resourceid;
//MessageBox.Show(rowGrant1[0]+" "+rowGrant1[1]+" "+rowGrant1[2]);
dsGrant1.Tables[0].Rows.Add(rowGrant1);
}
else
{
//删除指定权限
DataRow rowGrant1= dsGrant1.Tables[0].NewRow();
//rowGrant.BeginEdit();
rowGrant1[0] = categoryid;
rowGrant1[1] = subjectno;
rowGrant1[2] = resourceid;
//MessageBox.Show(rowGrant1[0]+" "+rowGrant1[1]+" "+rowGrant1[2]);
dsGrant1.Tables[0].Rows.Remove(rowGrant1);
}
dsGrantn.Merge(dsGrant1); }
}
public class Subject
{
public DataRow data = null;
public Subject(DataRow row)
{
this.data = row;
}
public static TreeNode newSubjectNode(DataRow row)
{
Subject subject = new Subject(row);
TreeNode node = new TreeNode(subject.data[1].ToString());
node.Tag = subject;
return node;
}
}

解决方案 »

  1.   

    为什么我这里向DataSet里新插入一行总是失败,删除一行也不可以总是报错!!
    以下是保存的代码:
    private void button1_Click(object sender, System.EventArgs e)
    {
        //SaveGrant();
                DataBaseAgent.UpdateDS(DataBaseAgent.ORACLECONNECTSTRING,this.dsGrantn,"TR_GRANT");
    MessageBox.Show("数据保存成功!");
    }
      

  2.   

    先说删除
    DataRow rowGrant1= dsGrant1.Tables[0].NewRow();只是创建这个DataTable结构的一个行,这个行和这个DataTable没有从属关系,所以你Remove的时候就出错插入好像看不出什么毛病,是不是主键之类的问题
      

  3.   

    raulredondo(),那我应该怎样删除DataSet中的改行?我怎样得到DataSet当前行那?
      

  4.   

    删除权限时,你先从该DataSet根据关键字查找到相应的数据行。
    row = FindRow(...);然后调用:
    row.Delete();再保存就可以了!
      

  5.   

    DataRow []rowGrant1=dsGrant1.Tables[0].Select("c_categoryid='"+categoryid+"' and c_subjectid='"+subjectno+"' and c_resourceid='"+resourceid+"'");
    rowGrant1[0].Delete();
    rowGrant1[0].AcceptChanges();
    ///我这样改可以吗??
      

  6.   

    DataRowView rowCategory = this.BindingContext[this.dsCategory, this.dsCategory.Tables[0].TableName].Current as DataRowView;你不是已经得到那行了吗,我没用过2005的DataRowView,不过应该可以得到相应的DataRow
      

  7.   

    谢谢各位帮忙!!我已经用其他的方法把问题解决了!不过还时要感谢大家的热心帮助,特别是raulredondo() 、JasonHeung(拥有一切不过就这样笑着哭),在这里我特别谢谢你们二位!!这段代码我回去后再调一下。。现在结贴!!