【问题标题】:DataGridViewComboBoxColumn not showing DataSourceDataGridViewComboBoxColumn 不显示数据源
【发布时间】:2018-07-14 08:23:34
【问题描述】:

我的代码:

private void InitGrid(DataTable dataTable, ref DataGridView grid, bool resetColumns)
{
    if (grid.Columns.Count > 0)
    {
        if (resetColumns)
        {
            grid.Columns.Clear();
            grid.DataSource = null;
        }
        else
        {
            return;
        }
    }
    DataGridViewColumn column;
    grid.AutoGenerateColumns = false;
    // apply entire data from table to grid.
    grid.DataSource = dataTable;

    // set column properties according to their type (combo, text, etc.)
    foreach (DataColumn col in dataTable.Columns)
    {
        if (m_ColumnTypes[col.ColumnName].Equals("COMBO"))
        {
            // get query number to load specific column's data
            string adminQuery = Server.LoadData("633", new List<string>() { col.ColumnName, m_TableFullName }).Rows[0][0].ToString();
            column = new DataGridViewComboBoxColumn();
            string queryParam = Controller.MainController.User;
            switch (col.ColumnName.ToUpper())
            {
                case "FIELD1NAME":
                    (column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
                    (column as DataGridViewComboBoxColumn).ValueMember = "field1id";
                    break;
                case "FIELD2NAME":
                    (column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
                    (column as DataGridViewComboBoxColumn).ValueMember = "field2id";
                    queryParam = string.Concat("select column_value from table(fn_mgr_workspaces('", Controller.MainController.User, "'))");
                    break;
                case "PRIORITY":
                    (column as DataGridViewComboBoxColumn).DisplayMember = col.ColumnName;
                    (column as DataGridViewComboBoxColumn).ValueMember = col.ColumnName;
                    queryParam = "10";    
                    break;
            }
            (column as DataGridViewComboBoxColumn).DataSource = Server.LoadData(adminQuery, new List<string>() { queryParam });
        }
        else
        {
            column = new DataGridViewTextBoxColumn() { AutoSizeMode = m_ColumnTypes[col.ColumnName].Equals("TAGS") ? DataGridViewAutoSizeColumnMode.Fill : DataGridViewAutoSizeColumnMode.AllCells, ReadOnly = true };
        }

        column.Name = col.ColumnName.ToUpper();
        column.HeaderText = m_ColumnNameTranslations[col.ColumnName.ToUpper()];
        column.DataPropertyName = column is DataGridViewComboBoxColumn ? (column as DataGridViewComboBoxColumn).ValueMember : col.ColumnName;

        grid.Columns.Add(column);
    }

    // after setting columns. going over every row and trying to filter out the datasource of field2. this is where my problem is
    foreach (DataGridViewRow dgvr in grid.Rows)
    {
        if (!dgvr.IsNewRow)
        {
            string wsId = dgvr.Cells["filed1id"].Value.ToString();
            DataTable filteredData = ((dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource as DataTable).Select("thefieldname = " + wsId).CopyToDataTable();
            DataView dv = filteredData.DefaultView;
            dv.Sort = "field2name";
            (dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource = null;
            (dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DisplayMember = "field2name";
            (dgvr.Cells["field2name"] as DataGridViewComboBoxCell).ValueMember = "field2id";
            (dgvr.Cells["field2name"] as DataGridViewComboBoxCell).DataSource = dv.ToTable();
        }
    }
}

(出于安全目的,字段名称和一些对象名称被打乱了)

我的问题:

作为 ComboboxColumn 的 field2 的 DataSource 不会改变。它总是向我显示整个数据,而不是我尝试为其设置的过滤数据。 即使我将其无效并将其重新设置为过滤后的数据,它也不起作用。

我想要实现的是 field2 列中的 DataSource 应该依赖于网格每一行的 field1 的数据。

我尝试为其他列设置数据源,而不是为 field2 设置它,然后遍历每一行并在 field2 上设置过滤的数据源,但它完全为空,好像为每一行设置的数据源还没有完全有效。

我做错了什么。我该怎么办?

【问题讨论】:

    标签: c# winforms datagridview binding datasource


    【解决方案1】:

    DataGridView 上的 EditControlShowing 事件将允许您完成此操作。

    向该方法添加事件处理程序。

    private void grid_EditingControlShowing(object sender, 
        DataGridViewEditingControlShowingEventArgs e)
    {
        if ( grid.CurrentCell.ColumnIndex == dgvr.Columns["field2name"].Index )
        {
    
             // Get Combobox
             ComboBox combo = e.Control as ComboBox;
    
             // Get Other Column's Value
             string wsId = grid.Rows[grid.CurrentCell.RowIndex].Cells["filed1id"].Value.ToString();
    
             // Get Filtered Data Based Off Of Other Column's Value
             DataTable filteredData = (combo.DataSource as DataTable).Select("thefieldname = " + wsId).CopyToDataTable();
             DataView dv = filteredData.DefaultView;
             dv.Sort = "field2name";
    
    
             // Rebind
             combo.DataSource = null;
             combo.DisplayMember = "field2name";
             combo.ValueMember = "field2id";
             combo.DataSource = dv.ToTable();
        }
    }
    

    【讨论】:

    • 嗨。谢谢,但这不是我想要的。在用户从第 1 列中选择一个值后,我成功在第 2 列中显示过滤后的数据。我需要的是一开始,当网格加载时,根据已经存在的值设置第 2 列中每个单元格的数据源在第 1 列中的每个匹配行中
    • 这是它通常的做法...列表的过滤发生在单元格的打开...而不是在网格完全绑定时
    猜你喜欢
    • 2011-12-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多