Как отфильтровать DataGridView в моем приложении - PullRequest
1 голос
/ 15 марта 2012

У меня есть две сетки, которые я настроил с помощью мастера winforms DataGridView. Один связан с таблицей командировок, которая является моей таблицей транзакций, а другой связан с моей таблицей расходов. Я немного знаю linq2sql, и теперь моя таблица расходов вставляется с помощью fk (TripId).

То, что я хочу сделать, это отфильтровать сетку расходов на основе tripId. Я уже получаю PK TripId текущей выбранной поездки, чтобы эта часть была выполнена. Я просто не уверен, как бы я делал фильтрацию, учитывая, что я использую 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 Ответ

1 голос
/ 15 марта 2012

Похоже, что вы хотите заполнить свой второй datagridview на основе выбора в вашем первом datagridview.Это один из способов сделать это:

  • В разделе «Загрузка или поиск моего первого datagridview» используйте событие DataBindingComplete, которое затем заполняет второе datagridview на основе идентификатора выбранной записи.в первом 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 для datagridview.Свойство Filter позволяет просматривать подмножество источника данных.

Пример из 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, чтобы применить фильтр.Тогда у меня есть кнопка, которая используется для удаления фильтра из источника привязки.

Вы можете применить то же самое к вашему сетевому представлению расходов, используя tripid из вашего первого сетевого обзора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...