问题描述:
      我使用了两个datagridview控件用于显示两张主从表,分别是:读者表和借书表。
  
代码如下:
  command.CommandText = "select * from  读者表 ";
            adapter.SelectCommand = command;
            adapter.Fill(ds );            command.CommandText = "select * from  借书表 ";
            adapter.SelectCommand = command;
            adapter.Fill(ds);
//下面一行代码报错
 DataRelation relation = new DataRelation("FK_读者表_借书表", ds.Tables["读者表"].Columns["借书证号"], ds.Tables["借书表"].Columns["借书证号"]); 
            ds.Relations.Add(relation);
            BindingSource bs_读者表= new BindingSource();  // 创建绑定源        
            BindingSource bs_借书表 = new BindingSource();
            bs_读者表.DataSource = ds.Tables["读者表"]; // 绑定到数据源——主表            bs_借书表.DataSource = ds.Relations["FK_读者表_借书表"]; // 绑定到关系——从表,注意:区分大小写            dataGridView2.DataSource = bs_读者表;  // DataGridView 显示        
            dataGridView3.DataSource = bs_借书表;
在运行的时候老是出现“为将对象引用设置为对象实例”,请各位高手帮帮忙,在此感激不尽!!(错误行已用红色字体显示)如果代码中还有其他问题,请帮忙指出来,谢谢!!!!

解决方案 »

  1.   

    没有细看,但红字部分可以把我的理解说一下,请考虑:
    你这样写:

    DataRelation relation = new DataRelation("FK_读者表_借书表", ds.Tables["读者表"].Columns["借书证号"], ds.Tables["借书表"].Columns["借书证号"]); 
      ds.Relations.Add(relation);
    】首先,你取出来的【ds.Tables["读者表"].Columns["借书证号"], 】是一个结果集,可能是多条。
    同理,令一个也是,而且,两个结果集得条数不一定相等。
    其次,你只NEW 了一个对象【relation 】,但是,却可能穿了N个值,一定错误!
    还有,【ds.Relations.Add(relation)】中的ADD方法一次只加一个对象,不会加一个集合,所以,要想加集合,需要做循环。
      

  2.   

    主从表是1:N的关系,你这段代码写的条理太不清晰,自己好好构思一下吧,想好了再写。
    思路:
    1 理清主从表的关系,怎样通过主取子(应该通过关系取),不是直接来个全取!!!!!!
    2 把NEW 的对象 放到循环中。往下自己想把。