我使用winforms DataGridView向导设置了两个网格。一个绑定到trip表,这是我的事务表,另一个绑定到我的开支表。我知道一点linq2sql,现在我的费用表插入了fk(TripId)。
我想要做的是根据tripId过滤费用网格。我已经检索了当前所选行程的TripId PK,以便完成该部分。考虑到我使用linq但是使用构建的向导绑定表,我只是不确定如何进行过滤。
任何帮助将不胜感激!
编辑:我已经在下面用bluefeet的帮助了解了这一点。现在的问题是当我做我的过滤器它只是清除网格而不是基于pk过滤。这是完整的代码
private void tripsBindingSource_PositionChanged(object sender, EventArgs e)
{
if (dgvTripGrid.CurrentRow != null)
{
//get selected row index
int index = this.dgvTripGrid.CurrentRow.Index;
//get pk of selected row using index
string cellValue = dgvTripGrid["pkTrips", index].Value.ToString();
//change pk string to int
int pKey = Int32.Parse(cellValue);
//int tripPrimKey = getPkRowTrips();
this.tripExpenseBindingSource.Filter = String.Format("tripNo = {0}",
pKey.ToString());
}
}
答案 0 :(得分:1)
听起来您希望根据第一个datagridview
中的选择来填充第二个datagridview
。这是一种方法:
datagridview
的加载或搜索中,使用该事件
DataBindingComplete
然后填充第二个datagridview
基于在第一个datagridview
中选择的记录的ID。BindingSource_PositionChanged
上的事件重新填充第二个
网格。代码示例
// this populates the grid.
private void SearchButton_Click(object sender, EventArgs e)
{
// your code to load your grid goes here
}
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
var drv = datagridview1bindingSource.Current as DataRowView;
if(drv != null)
// your method to load datagridview2 goes here if the selected row is not null
LoadDataGridView2();
}
private void LoadDataGridView2()
{
//populate datagridview2 using the selected row id from datagridview1
}
// finally when the position is changed on the datagridview1 binding source, then re-populate // the datagridview2
private void datagridview2BindingSource_PositionChanged(object sender, EventArgs e)
{
LoadDataGridView2();
}
这是根据第一个网格中的选择填充第二个网格的基本方法。
编辑:
您的评论表示您填写了datagridview
所有费用,因此要过滤,您需要使用Filter
上的BindingSource
属性datagridview
。 Filter
属性允许您查看DataSource的子集。
来自MSDN的示例:
private void PopulateDataViewAndFilter()
{
DataSet set1 = new DataSet();
// Some xml data to populate the DataSet with.
string musicXml =
"<?xml version='1.0' encoding='UTF-8'?>" +
"<music>" +
"<recording><artist>Coldplay</artist><cd>X&Y</cd></recording>" +
"<recording><artist>Dave Matthews</artist><cd>Under the Table and Dreaming</cd></recording>" +
"<recording><artist>Dave Matthews</artist><cd>Live at Red Rocks</cd></recording>" +
"<recording><artist>Natalie Merchant</artist><cd>Tigerlily</cd></recording>" +
"<recording><artist>U2</artist><cd>How to Dismantle an Atomic Bomb</cd></recording>" +
"</music>";
// Read the xml.
StringReader reader = new StringReader(musicXml);
set1.ReadXml(reader);
// Get a DataView of the table contained in the dataset.
DataTableCollection tables = set1.Tables;
DataView view1 = new DataView(tables[0]);
// Create a DataGridView control and add it to the form.
DataGridView datagridview1 = new DataGridView();
datagridview1.AutoGenerateColumns = true;
this.Controls.Add(datagridview1);
// Create a BindingSource and set its DataSource property to
// the DataView.
BindingSource source1 = new BindingSource();
source1.DataSource = view1;
// Set the data source for the DataGridView.
datagridview1.DataSource = source1;
//The Filter string can include Boolean expressions.
source1.Filter = "artist = 'Dave Matthews' OR cd = 'Tigerlily'";
}
我使用这种类型的过滤器来显示基于帐户的数据。对于一个帐户,当用户放置帐号时我有一个文本框,我使用TextChanged事件来应用过滤器。然后我有一个按钮,用于从绑定源中删除过滤器。
您可以使用第一个datagridview中的tripid将相同的内容应用于费用datagridview。