两个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的某一数据行时,就出现错误提示:表没有主键。
{
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的某一数据行时,就出现错误提示:表没有主键。
引发的!因为你选中的不一定是你的主键列!
其一是: DA.MissingSchemaAction = MissingSchemaAction.AddWithKey 在读取当时匹配数据库表的主键
另一种是:在DATATABLE上添加一个主键,联机文档中有
DataRow row = sourceView.Table.Rows.Find(key);
上面代码中,根据Key値进行查找的时候,因为Key不是唯一值,所以有可能找到两个及以上的记录,所以会出现 “表没有主键”的错误提示
注意,你必须保证sourceView.Table.Rows.Find(“”)中的値为唯一性