两个dataGridView,当点击第一个dataGridView的某一数据行时,第二个dataGridView显示相应的数据,我的代码是:namespace DataRelationsDemo
{
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
        }        private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("Server=(local);User=sa;Pwd=sa;DataBase=Northwind");            con.Open();            SqlCommand com = new SqlCommand();
            com.Connection = con;
            com.CommandText = "SELECT * FROM Customers;SELECT * FROM Orders";            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = com;            DataSet dsMain = new DataSet();
            dataAdapter.Fill(dsMain);            dsMain.Tables[0].TableName = "Customers";
            dsMain.Tables[1].TableName = "Orders";            DataColumn[] parentColumn = new DataColumn[1];
            parentColumn[0] = dsMain.Tables["Customers"].Columns["CustomerID"];            DataColumn[] childColumn = new DataColumn[1];
            childColumn[0] = dsMain.Tables["Orders"].Columns["CustomerID"];            DataRelation customerRelation = new DataRelation("customerRelation", parentColumn, childColumn);
            dsMain.Relations.Add(customerRelation);            dataGridView1.DataSource = dsMain.Tables["Customers"].DefaultView;
            dataGridView1.CurrentCellChanged += new EventHandler(dataGridView1_CurrentCellChanged);
        }        private DataRelation CreateRelation()
        {
            SqlConnection con = new SqlConnection("Server=(local);User=sa;Pwd=sa;DataBase=Northwind");            con.Open();            SqlCommand com = new SqlCommand();
            com.Connection = con;
            com.CommandText = "SELECT * FROM Customers;SELECT * FROM Orders";            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = com;            DataSet dsMain = new DataSet();
            dataAdapter.Fill(dsMain);            dsMain.Tables[0].TableName = "Customers";
            dsMain.Tables[1].TableName = "Orders";            DataColumn[] parentColumn = new DataColumn[1];
            parentColumn[0] = dsMain.Tables["Customers"].Columns["CustomerID"];            DataColumn[] childColumn = new DataColumn[1];
            childColumn[0] = dsMain.Tables["Orders"].Columns["CustomerID"];            DataRelation customerRelation = new DataRelation("customerRelation", parentColumn, childColumn);            return customerRelation;
        }        void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
        {
            DataRow[] rows;
            int rowIndex;            rowIndex = ((DataGridView)sender).CurrentCell.RowIndex;            string key = ((DataGridView)sender)[rowIndex, 0].ToString();            DataView sourceView = ((DataView)((DataGridView)sender).DataSource);
            DataRow row = sourceView.Table.Rows.Find(key);
            DataRelation rel = CreateRelation();
            rows = row.GetChildRows(rel);            DataSet tmpData = new DataSet();
            tmpData.Merge(rows);
            dataGridView2.DataSource = tmpData.Tables[0].DefaultView;
            //MessageBox.Show(rowIndex.ToString());
        }
    }
}但是,当我点击dataGridView1的某一数据行时,就出现错误提示:表没有主键。

解决方案 »

  1.   

    DataRow row = sourceView.Table.Rows.Find(key);
    引发的!因为你选中的不一定是你的主键列!
      

  2.   

    有两种方法
    其一是: DA.MissingSchemaAction = MissingSchemaAction.AddWithKey 在读取当时匹配数据库表的主键
    另一种是:在DATATABLE上添加一个主键,联机文档中有
      

  3.   

               string key = ((DataGridView)sender)[rowIndex, 0].ToString();            DataView sourceView = ((DataView)((DataGridView)sender).DataSource);
                DataRow row = sourceView.Table.Rows.Find(key);
      上面代码中,根据Key値进行查找的时候,因为Key不是唯一值,所以有可能找到两个及以上的记录,所以会出现 “表没有主键”的错误提示
      
      注意,你必须保证sourceView.Table.Rows.Find(“”)中的値为唯一性
      

  4.   

    我使用的是SQL 2000里自带的数据库Northwind,两个表的主键值都是唯一的,楼上的lhblxm说的方法我试过,还是出现一样的错误提示。