DataGridViewComboBoxColumn not showing DataSource



我的代码:

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();
        }
    }
}

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

我的问题:

字段 2 的数据源(即组合框列(不会更改。它总是向我显示整个数据,而不是我尝试为其设置的过滤数据。即使我将其取消并将其重新设置为过滤后的数据,它也无法正常工作。

我试图实现的是字段 2 列中的数据源应该依赖于网格每一行的字段 1 的数据。

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

我做错了什么。我到底该怎么做?

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

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

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();
    }
}

最新更新