Фильтровать внешние ключи в DataGridView

Я использую C# и DataGridView WinForms, привязываясь к DataTable. Мой DataGridView содержит следующие столбцы:

  • MaterialId (внешний ключ только для чтения, отображающий название материала)
  • PricelistId (DataGridViewComboBoxCell с выбираемым внешним ключом)

Каждый материал имеет определенные прайс-листы, которые относятся к нему. Эта информация есть в моей таблице прайс-листов.

В настоящее время Когда я нажимаю комбинацию PricelistId, я получаю все прайс-листы, независимо от того, к какому материалу они относятся. Но я хочу отфильтровать это по значению MaterialId. Так, например, если материалом в первой строке является сталь, в поле прайс-листа должны отображаться только стальные прайс-листы. Если материал второй строки - пластик, в соответствующей комбинации должны отображаться только прайс-листы, относящиеся к пластику.

Это возможно?

Спасибо!


person Alex    schedule 06.03.2018    source источник
comment
comment
@RezaAghaei большое спасибо, это то, что мне было нужно. Я конвертирую его в C#, немного адаптирую под свои нужды и опубликую здесь. Еще раз спасибо!   -  person Alex    schedule 06.03.2018


Ответы (1)


Основываясь на комментарии @RezaAghaei, вот прототип на C#, адаптированный для моих нужд, а также исправляющий проблему (текущий выбранный элемент будет сброшен).

Спасибо!

public partial class Form1 : Form
{
    private DataGridView _dataGridView = new DataGridView();
    private DataSet _dataSet = new DataSet();


    public Form1()
    {
        InitializeComponent();

        GenerateDataSet();
        CreateDataGridView();
    }


    private void CreateDataGridView()
    {
        var MaterialsColumn = new DataGridViewComboBoxColumn
        {
            DataPropertyName = "MaterialId",
            HeaderText = "Material",
            DataSource = _dataSet.Tables["Materials"],
            DisplayMember = "Name",
            ValueMember = "Id",
            Name = "MaterialColumn",
            ReadOnly = true
        };

        var PricelistsColumn = new DataGridViewComboBoxColumn
        {
            DataPropertyName = "PricelistId",
            HeaderText = "Pricelist",
            DataSource = _dataSet.Tables["Pricelists"],
            DisplayMember = "Name",
            ValueMember = "Id",
            Name = "PricelistColumn"
        };

        _dataGridView.AutoGenerateColumns = false;
        _dataGridView.Columns.AddRange(MaterialsColumn, PricelistsColumn);
        _dataGridView.DataSource = _dataSet.Tables["PricelistAssignments"];

        _dataGridView.Dock = DockStyle.Fill;
        _dataGridView.EditingControlShowing += EditingControlShowing;
        _dataGridView.AllowUserToAddRows = false;
        _dataGridView.AllowUserToDeleteRows = false;
        Controls.Add(_dataGridView);
    }


    private void GenerateDataSet()
    {
        // Create tables
        _dataSet.Tables.Add("Materials");
        _dataSet.Tables["Materials"].Columns.Add("Id", typeof(int));
        _dataSet.Tables["Materials"].Columns.Add("Name", typeof(string));

        _dataSet.Tables.Add("Pricelists");
        _dataSet.Tables["Pricelists"].Columns.Add("Id", typeof(int));
        _dataSet.Tables["Pricelists"].Columns.Add("Name", typeof(string));
        _dataSet.Tables["Pricelists"].Columns.Add("MaterialId", typeof(int));

        _dataSet.Tables.Add("PricelistAssignments");
        _dataSet.Tables["PricelistAssignments"].Columns.Add("MaterialId", typeof(int));
        _dataSet.Tables["PricelistAssignments"].Columns.Add("PricelistId", typeof(int));

        // Populate tables
        _dataSet.Tables["Materials"].Rows.Add(1, "Steel");
        _dataSet.Tables["Materials"].Rows.Add(2, "Plastic");
        _dataSet.Tables["Pricelists"].Rows.Add(1, "PL Steel 1", 1);
        _dataSet.Tables["Pricelists"].Rows.Add(2, "PL Plastic 1", 2);
        _dataSet.Tables["Pricelists"].Rows.Add(3, "PL Steel 2", 1);
        _dataSet.Tables["Pricelists"].Rows.Add(4, "PL Plastic 2", 2);
        _dataSet.Tables["Pricelists"].Rows.Add(5, "PL Plastic 3", 2);
        _dataSet.Tables["PricelistAssignments"].Rows.Add(1, 3);
        _dataSet.Tables["PricelistAssignments"].Rows.Add(1, 1);
        _dataSet.Tables["PricelistAssignments"].Rows.Add(2, 4);
    }


    private void EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        var grid = (DataGridView)sender;

        if (grid.CurrentCell.ColumnIndex == 1) // Pricelist column
        {
            var combo = (DataGridViewComboBoxEditingControl)e.Control;
            var selectedValue = combo.SelectedValue;
            var data = _dataSet.Tables["Pricelists"].AsDataView();
            data.RowFilter = "MaterialId = " + grid.CurrentRow.Cells[0].Value.ToString();
            combo.DataSource = data;
            combo.SelectedValue = selectedValue;
        }
    }
}
person Alex    schedule 07.03.2018