我正在尝试创建一个两个datagridview Master-Detail表单来显示SQL语句的结果,但似乎有一个额外的复杂性,因为我要显示的两个结果来自同一个表:我想要只显示在顶部网格中显示的ID,然后从表格的其余部分开始详细说明底部网格中显示的相同ID。如果我使用了错误的方法,那么有人可以指出我错误的方向吗?
我当前的问题是代码到达DataRelation Rel = new DataRelation....
并在那时显示表单(两个DataGrids都是空白的),而不是执行其余的代码。
我已粘贴以下完整版:
private void Form1_Load(object sender, EventArgs e)
{
SpContain.Panel1.Controls.Add(masterDataGridView);
SpContain.Panel2.Controls.Add(detailsDataGridView);
masterDataGridView.DataSource = masterBindingSource;
detailsDataGridView.DataSource = detailsBindingSource;
GetData();
}
private void GetData()
{
string ConnStr = "Server=TradarUAT\\uattradar; Integrated Security=SSPI; Initial Catalog=TradeFiles;";
SqlConnection Conn = new SqlConnection(ConnStr);
DataSet Data = new DataSet();
Data.Locale = System.Globalization.CultureInfo.InvariantCulture;
SqlDataAdapter masterDataAdapter = new SqlDataAdapter("Select MasterReference from [TradeFiles].[dbo].[OMG-Rejects] GROUP BY MasterReference", Conn);
masterDataAdapter.Fill(Data, "[TradeFiles].[dbo].[OMG-Rejects]");
SqlDataAdapter detailDataAdapter = new SqlDataAdapter("Select ImportedDT,TypeIndicator,FileNumber,MasterReference,ClientAlocRef,VersionNumber,DateTimeStamp,ErrorID,ErrorKey,ErrorTxt,ErrorParamType,ErrorParamValue from [TradeFiles].[dbo].[OMG-Rejects]", Conn);
detailDataAdapter.Fill(Data, "[TradeFiles].[dbo].[OMG-Rejects]");
DataRelation Rel = new DataRelation("RejectDetail",
Data.Tables[0].Columns["MasterReference"], Data.Tables[1].Columns["MasterReference"]);
代码在上一行停止执行
Data.Relations.Add(Rel);
masterBindingSource.DataSource = Data;
masterBindingSource.DataMember = "[TradeFiles].[dbo].[OMG-Rejects]";
detailsBindingSource.DataSource = masterBindingSource;
detailsBindingSource.DataMember = "RejectDetail";
}
答案 0 :(得分:0)
通过在SQL服务器上创建一个模拟我试图实现的第一个选择语句的视图来解决这个问题。然后我刚刚引用了masterDataAdapter中的视图,并从detailDataAdapter中的基础表中检索了其余的信息。