C# 使用数据库作为源的主详细视图获取详细信息中的元素数
我使用两个连接到同一数据库的C# 使用数据库作为源的主详细视图获取详细信息中的元素数,c#,database,data-binding,datagridview,datasource,C#,Database,Data Binding,Datagridview,Datasource,我使用两个连接到同一数据库的BindingSourceDataGridViews创建了一个主细节视图。数据库有两个表,我在它们之间建立了一个主-详细视图。以下是对此负责的代码: private void GetData() { try { // Specify a connection string. Replace the given value with a // valid connection string for a Northwind SQL Server samp
BindingSource
DataGridViews创建了一个主细节视图。数据库有两个表,我在它们之间建立了一个主-详细视图。以下是对此负责的代码:
private void GetData()
{
try
{
// Specify a connection string. Replace the given value with a
// valid connection string for a Northwind SQL Server sample
// database accessible to your system.
String connectionString =
"Integrated Security=SSPI;Persist Security Info=False;" +
"Initial Catalog=Northwind;Data Source=localhost";
SqlConnection connection = new SqlConnection(connectionString);
// Create a DataSet.
DataSet data = new DataSet();
data.Locale = System.Globalization.CultureInfo.InvariantCulture;
// Add data from the Customers table to the DataSet.
SqlDataAdapter masterDataAdapter = new
SqlDataAdapter("select * from Customers", connection);
masterDataAdapter.Fill(data, "Customers");
// Add data from the Orders table to the DataSet.
SqlDataAdapter detailsDataAdapter = new
SqlDataAdapter("select * from Orders", connection);
detailsDataAdapter.Fill(data, "Orders");
// Establish a relationship between the two tables.
DataRelation relation = new DataRelation("CustomersOrders",
data.Tables["Customers"].Columns["CustomerID"],
data.Tables["Orders"].Columns["CustomerID"]);
data.Relations.Add(relation);
// Bind the master data connector to the Customers table.
masterBindingSource.DataSource = data;
masterBindingSource.DataMember = "Customers";
// Bind the details data connector to the master data connector,
// using the DataRelation name to filter the information in the
// details table based on the current row in the master table.
detailsBindingSource.DataSource = masterBindingSource;
detailsBindingSource.DataMember = "CustomersOrders";
}
catch (SqlException)
{
MessageBox.Show("To run this example, replace the value of the " +
"connectionString variable with a connection string that is " +
"valid for your system.");
}
}
而且效果很好。接下来,我在主视图中添加了一个自定义列,并按照相同的教程使用此代码段编辑主视图的外观
// Changes how cells are displayed depending on their columns and values.
private void masterGridView_CellFormatting(object sender,
System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
// Set the background to red for negative values in the Balance column.
if (masterGridView.Columns[e.ColumnIndex].Name.Equals("CustomColumn"))
{
e.CellStyle.BackColor = Color.Red;
e.CellStyle.SelectionBackColor = Color.DarkRed;
}
}
现在,我希望在选择不同的主视图时,获得每个细节视图中的行数。我将把它添加到自定义列中。这就是我被卡住的地方。如何从最后一个代码段中的cell formatter事件访问计数?我也可以访问视图和数据源。加载数据并添加自定义列后,请尝试使用该方法计算“详细信息”视图中的行数。这将设置初始值:
DataSet ds = this.masterBindingSource.DataSource as DataSet;
string tableName = this.masterBindingSource.DataMember;
foreach (DataGridViewRow row in this.masterDataGridView.Rows)
{
row.Cells["CustomColumn"].Value = ds.Tables[tableName].Rows[row.Index].GetChildRows(ds.Relations[0]).Length;
}
如果允许用户从“详细信息”视图中添加/删除行,我建议首先设置以下(*): 从那里,您需要附加到详细信息数据表上的
RowChanged
和rowdeleding
事件:
ds.Tables["Orders"].RowChanged += Details_RowChanged;
ds.Tables["Orders"].RowDeleting += Details_RowChanged;
在该事件处理程序中,我们将再次基于GetChildRows
方法设置主行的自定义列值。特别注意事项:
- 对于已删除的行,该计数尚未反映删除情况。我们将对此作出解释
- 对于添加的行,除非您已经在添加时设置了父行,否则需要在此处处理此问题
private void Details_RowChanged(object sender, DataRowChangeEventArgs e)
{
int change = 0;
DataSet ds = this.masterBindingSource.DataSource as DataSet;
if (e.Action == DataRowAction.Add)
{
DataRow parent = null;
foreach (DataRow dr in ds.Tables["Customers"].Rows)
{
if (dr["CustomerID"].Equals(e.Row["CustomerID"]))
{
parent = dr;
break;
}
}
e.Row.SetParentRow(parent);
}
else if (e.Action == DataRowAction.Delete)
{
change = -1;
}
DataRow row = e.Row.GetParentRow(ds.Relations[0]);
int index = ds.Tables["Customers"].Rows.IndexOf(row);
this.masterDataGridView.Rows[index].Cells["CustomColumn"].Value = row.GetChildRows(ds.Relations[0]).Length + change;
}
(*)添加行应以编程方式完成-
DataTable.rows.Add(params object[]value)
-当添加到数据绑定DataGridView
时
private void Details_RowChanged(object sender, DataRowChangeEventArgs e)
{
int change = 0;
DataSet ds = this.masterBindingSource.DataSource as DataSet;
if (e.Action == DataRowAction.Add)
{
DataRow parent = null;
foreach (DataRow dr in ds.Tables["Customers"].Rows)
{
if (dr["CustomerID"].Equals(e.Row["CustomerID"]))
{
parent = dr;
break;
}
}
e.Row.SetParentRow(parent);
}
else if (e.Action == DataRowAction.Delete)
{
change = -1;
}
DataRow row = e.Row.GetParentRow(ds.Relations[0]);
int index = ds.Tables["Customers"].Rows.IndexOf(row);
this.masterDataGridView.Rows[index].Cells["CustomColumn"].Value = row.GetChildRows(ds.Relations[0]).Length + change;
}