如何在我的应用程序中过滤DataGridView

时间:2012-03-15 15:57:32

标签: c# winforms linq-to-sql c#-4.0

我使用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());

        }
    }

1 个答案:

答案 0 :(得分:1)

听起来您希望根据第一个datagridview中的选择来填充第二个datagridview。这是一种方法:

  • 在我的第一个datagridview的加载或搜索中,使用该事件 DataBindingComplete然后填充第二个datagridview 基于在第一个datagridview中选择的记录的ID。
  • 然后,如果第一个datagridview中的选择发生变化,我会使用 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属性datagridviewFilter属性允许您查看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&amp;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。