代码之家  ›  专栏  ›  技术社区  ›  Alex

在DataGridView中筛选外键

  •  1
  • Alex  · 技术社区  · 8 年前

    我正在使用C#和DataGridView WinForms,绑定到DataTable。My DataGridView包含以下列:

    • MaterialId(显示材料标题的只读外键)
    • PricelistId(带可选外键的DataGridViewComboxCell)

    每种材料都有属于它的特定价格表。此信息存在于我的价格表中。

    当前,当我单击PricelistId组合时,我会得到所有的价格表,无论它们属于哪种材料。但我想根据物质价值来过滤它。因此,例如,如果第一行上的材料是钢,则价格表字段中只应显示钢价格表。如果第二行的材料是塑料,则在相应的组合框中只应显示与塑料相关的价格表。

    这可能吗?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   Alex    8 年前

    根据@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;
            }
        }
    }