C# DataGridViewComboxCell已填充,但不会显示内容

C# DataGridViewComboxCell已填充,但不会显示内容,c#,winforms,C#,Winforms,我正在尝试为我设置为ComboBoxcolumn的datagridview列之一动态设置自定义dropdownlist。当我运行应用程序时,我看到单元格中有值。但是,我在UI中没有看到弹出值 private void CustomComboBoxColumns(string filter) { DataGridViewComboBoxColumn ComboBoxColumn = new DataGridViewComboBoxColumn(); Data

我正在尝试为我设置为ComboBoxcolumn的datagridview列之一动态设置自定义dropdownlist。当我运行应用程序时,我看到单元格中有值。但是,我在UI中没有看到弹出值

private void CustomComboBoxColumns(string filter)
    {
        DataGridViewComboBoxColumn ComboBoxColumn = new DataGridViewComboBoxColumn();
        DataTable dt;
        ComboBoxColumn.HeaderText = "category";
        ComboBoxColumn.DataPropertyName = "category";
        ComboBoxColumn.ReadOnly = false;
        ComboBoxColumn.MaxDropDownItems = 100;
        ComboBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
        ComboBoxColumn.FlatStyle = FlatStyle.Flat;
        ComboBoxColumn.ValueMember = "category";
        ComboBoxColumn.DisplayMember = "category";
        _iprDataGridView.Columns.Insert(16, ComboBoxColumn);
        for (int i = 0; i < _iprDataGridView.Rows.Count; i++)
        {
            dt = GetDataForCategory(filter);
            ((DataGridViewComboBoxCell)_iprDataGridView.Rows[i].Cells[16]).DataSource = dt;
        }
    }

    private DataTable GetDataForCategory(string filter)
    {
        DbConnection db = new DbConnection();
        string connString = db.BuildConnectionString();
        DataTable dt = new DataTable();
        DataSet ds = new DataSet();
        string query = "Select category from cd_category where category like '%" + filter + "%' order by category";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }

            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            da.Fill(ds, "category");
            dt = ds.Tables["category"];
            da.Dispose();
            conn.Close();
        }
        return dt;
    }
我想在完成ConfigureTextBoxColumns()之后,我将创建一个方法,该方法将遍历datagridview,创建一个新的类别ComboxColumn,并根据另一个columns值插入一个新的ComboxCell

下面是如何为datagridview生成列的代码

private void ConfigureComboBoxColumns()
    {
        DataGridViewHelper dataGridViewHelper = new DataGridViewHelper();
        // Columns being converted to comboboxcolumns must be removed, created, and re-inserted
        dataGridViewHelper.RemoveColumns(ref _iprDataGridView,
                                         Columns.severity.ToString(),
                                         Columns.phase.ToString(),
                                         Columns.app.ToString(),
                                         Columns.project.ToString(),
                                         Columns.acceptancePeriod.ToString(),
                                         Columns.classConfirmed.ToString(),
                                         Columns.oncall.ToString(),
                                         Columns.warranty.ToString(),
                                         Columns.release.ToString(),
                                         Columns.category.ToString(),
                                         Columns.ticketType.ToString());

        DataGridViewComboBoxColumn comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.severity.ToString());
        comboBoxColumn.ValueType = typeof(int);
        string query = IPRDetailsConstants.SELECT_SEVERITY + IPRDetailsConstants.SEVERITY_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.severity.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.severity, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.phase.ToString());
        query = IPRDetailsConstants.SELECT_PHASE + IPRDetailsConstants.PHASE_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.phase.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.phase, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.app.ToString());
        query = IPRDetailsConstants.SELECT_APP + IPRDetailsConstants.APP_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.app.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.app, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.project.ToString());
        bool activeProjectsOnly = bool.Parse(ConfigurationManager.AppSettings.Get("ActiveProjectsOnly"));
        query = IPRDetailsConstants.SELECT_PROJECT + (activeProjectsOnly ? IPRDetailsConstants.PROJECT_COL_ACTIVE : IPRDetailsConstants.PROJECT_COL);
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.project.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.project, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.acceptancePeriod.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_ap;
        comboBoxColumn.HeaderCell.ToolTipText = "acceptancePeriod";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.acceptancePeriod.ToString(), Resources.Y, Resources.N, Resources.S, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.acceptancePeriod, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.classConfirmed.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_cc;
        comboBoxColumn.HeaderCell.ToolTipText = "classConfirmed";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.classConfirmed.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.classConfirmed, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.oncall.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_oc;
        comboBoxColumn.HeaderCell.ToolTipText = "onCall";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.oncall.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.oncall, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.warranty.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_w;
        comboBoxColumn.HeaderCell.ToolTipText = "warranty";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.warranty.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.warranty, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.ticketType.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_tt;
        comboBoxColumn.HeaderCell.ToolTipText = "ticketType";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.ticketType.ToString(), "I", "P", "R", "K", "Q");
        _iprDataGridView.Columns.Insert((int)Columns.ticketType, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.release.ToString());
        bool activeReleasesOnly = bool.Parse(ConfigurationManager.AppSettings.Get("ActiveReleasesOnly"));
        query = IPRDetailsConstants.SELECT_RELEASE + (activeReleasesOnly ? IPRDetailsConstants.RELEASE_COL_ACTIVE : IPRDetailsConstants.RELEASE_COL);
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.release.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.release, comboBoxColumn);

        /*
        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.category.ToString());
        query = IPRDetailsConstants.SELECT_CATEGORY + IPRDetailsConstants.CATEGORY_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.category.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.category, comboBoxColumn);
        */

    }

我注释掉了他们的分类栏,以插入我自己的分类。我正在更新这个不是我开发的应用程序。

看起来您正在尝试将数据绑定到控件。设置源之后,必须绑定它。请参阅我所做的编辑。此链接提供了更多信息和示例

private void customComboxColumns(字符串过滤器)
{
DataGridViewComboBoxColumn ComboxColumn=新DataGridViewComboxColumn();
数据表dt;
ComboBoxColumn.HeaderText=“类别”;
ComboBoxColumn.DataPropertyName=“类别”;
ComboBoxColumn.ReadOnly=false;
ComboBoxColumn.MaxDropDownItems=100;
ComboBoxColumn.AutoSizeMode=DataGridViewAutoSizeColumnMode.DisplayedCells;
ComboBoxColumn.FlatStyle=FlatStyle.Flat;
ComboBoxColumn.ValueMember=“类别”;
ComboBoxColumn.DisplayMember=“类别”;
_iprDataGridView.Columns.Insert(16,ComboBoxColumn);
对于(int i=0;i<_iprDataGridView.Rows.Count;i++)
{
dt=GetDataForCategory(过滤器);
((DataGridViewComboxCell)iprDataGridView.Rows[i].Cells[16])。数据源=dt;
((DataGridViewComboxCell)iprDataGridView.Rows[i].Cells[16]).DataBind();//此编辑
}
}

我还强烈建议学习使用参数化查询来防止sql注入

看起来您正在尝试将数据绑定到控件。设置源之后,必须绑定它。请参阅我所做的编辑。此链接提供了更多信息和示例

private void customComboxColumns(字符串过滤器)
{
DataGridViewComboBoxColumn ComboxColumn=新DataGridViewComboxColumn();
数据表dt;
ComboBoxColumn.HeaderText=“类别”;
ComboBoxColumn.DataPropertyName=“类别”;
ComboBoxColumn.ReadOnly=false;
ComboBoxColumn.MaxDropDownItems=100;
ComboBoxColumn.AutoSizeMode=DataGridViewAutoSizeColumnMode.DisplayedCells;
ComboBoxColumn.FlatStyle=FlatStyle.Flat;
ComboBoxColumn.ValueMember=“类别”;
ComboBoxColumn.DisplayMember=“类别”;
_iprDataGridView.Columns.Insert(16,ComboBoxColumn);
对于(int i=0;i<_iprDataGridView.Rows.Count;i++)
{
dt=GetDataForCategory(过滤器);
((DataGridViewComboxCell)iprDataGridView.Rows[i].Cells[16])。数据源=dt;
((DataGridViewComboxCell)iprDataGridView.Rows[i].Cells[16]).DataBind();//此编辑
}
}

我还强烈建议学习使用参数化查询来防止sql注入

DataGridViewComboxCell不包含定义。DataBind()。是的,我以前使用过参数化查询,但为了解决问题,我只使用了这个路由。DataGridViewComboxCell不包含定义。DataBind()。也是的,我以前使用过参数化查询,但为了解决问题,我只是使用了这个方法。不清楚您想要做什么。您希望列中的所有组合框都具有“相同的值”还是希望每个组合框具有不同的值?这是两件不同的事情。通过设置“DataGridViewComboBoxColumns”
数据源,使它们完全相同是非常简单的。
这将使用相同的值设置所有行,包括任何新行。将“每个”单元格设置为其自己的
DataGridViewComboxCell
将需要您做更多的工作。这将包括每次添加新行时填充组合框。我猜这就是你看到的。添加新行时,我没有看到填充组合框的
RowsAdded
事件。是的,因此我将每个单元格设置为其自己的DataGridViewComboxCell,前一个人为整个列使用相同的ComboxCell生成了一列,然后在datagridview绑定后插入。我只是想更新一列,这样每个单元格都有自己的ComboxCell。从我的测试中,发布的代码按预期工作。我可以看到所有行上的组合框值,但最后一行“新建”除外。我猜还有别的事情发生。由于不知道您在每个组合框中放置的“什么”项,我只能假设它们完全不同。
CustomComboBoxColumn
方法将组合列添加到网格中,然后在网格中的所有行中循环以设置每个组合框。如果用户“添加”一个新行,那么删除/重新添加组合框列然后再次循环所有行是没有意义的?如何确定每个组合框中的项目?我们可以看到一个“filter”字符串,它根据该字符串获取值,但是,“where”是filter字符串的来源?不清楚您想要做什么。您希望列中的所有组合框都具有“相同的值”还是希望每个组合框具有不同的值?这是两件不同的事情。通过设置“DataGridViewComboBoxColumns”
DataSource,让它们完全相同是非常简单的。
这将设置sa的所有行
private void ConfigureComboBoxColumns()
    {
        DataGridViewHelper dataGridViewHelper = new DataGridViewHelper();
        // Columns being converted to comboboxcolumns must be removed, created, and re-inserted
        dataGridViewHelper.RemoveColumns(ref _iprDataGridView,
                                         Columns.severity.ToString(),
                                         Columns.phase.ToString(),
                                         Columns.app.ToString(),
                                         Columns.project.ToString(),
                                         Columns.acceptancePeriod.ToString(),
                                         Columns.classConfirmed.ToString(),
                                         Columns.oncall.ToString(),
                                         Columns.warranty.ToString(),
                                         Columns.release.ToString(),
                                         Columns.category.ToString(),
                                         Columns.ticketType.ToString());

        DataGridViewComboBoxColumn comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.severity.ToString());
        comboBoxColumn.ValueType = typeof(int);
        string query = IPRDetailsConstants.SELECT_SEVERITY + IPRDetailsConstants.SEVERITY_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.severity.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.severity, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.phase.ToString());
        query = IPRDetailsConstants.SELECT_PHASE + IPRDetailsConstants.PHASE_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.phase.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.phase, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.app.ToString());
        query = IPRDetailsConstants.SELECT_APP + IPRDetailsConstants.APP_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.app.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.app, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.project.ToString());
        bool activeProjectsOnly = bool.Parse(ConfigurationManager.AppSettings.Get("ActiveProjectsOnly"));
        query = IPRDetailsConstants.SELECT_PROJECT + (activeProjectsOnly ? IPRDetailsConstants.PROJECT_COL_ACTIVE : IPRDetailsConstants.PROJECT_COL);
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.project.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.project, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.acceptancePeriod.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_ap;
        comboBoxColumn.HeaderCell.ToolTipText = "acceptancePeriod";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.acceptancePeriod.ToString(), Resources.Y, Resources.N, Resources.S, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.acceptancePeriod, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.classConfirmed.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_cc;
        comboBoxColumn.HeaderCell.ToolTipText = "classConfirmed";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.classConfirmed.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.classConfirmed, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.oncall.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_oc;
        comboBoxColumn.HeaderCell.ToolTipText = "onCall";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.oncall.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.oncall, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.warranty.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_w;
        comboBoxColumn.HeaderCell.ToolTipText = "warranty";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.warranty.ToString(), Resources.Y, Resources.N, Resources.X);
        _iprDataGridView.Columns.Insert((int)Columns.warranty, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.ticketType.ToString());
        comboBoxColumn.HeaderText = Resources.IprDetails_ConfigureComboBoxColumns_tt;
        comboBoxColumn.HeaderCell.ToolTipText = "ticketType";
        dataGridViewHelper.SetComboBoxChoicesStatic(ref comboBoxColumn, Columns.ticketType.ToString(), "I", "P", "R", "K", "Q");
        _iprDataGridView.Columns.Insert((int)Columns.ticketType, comboBoxColumn);

        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.release.ToString());
        bool activeReleasesOnly = bool.Parse(ConfigurationManager.AppSettings.Get("ActiveReleasesOnly"));
        query = IPRDetailsConstants.SELECT_RELEASE + (activeReleasesOnly ? IPRDetailsConstants.RELEASE_COL_ACTIVE : IPRDetailsConstants.RELEASE_COL);
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.release.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.release, comboBoxColumn);

        /*
        comboBoxColumn = dataGridViewHelper.CreateComboBoxColumn(Columns.category.ToString());
        query = IPRDetailsConstants.SELECT_CATEGORY + IPRDetailsConstants.CATEGORY_COL;
        dataGridViewHelper.SetComboBoxChoicesDataSource(ref comboBoxColumn, Columns.category.ToString(), query, dbConnection);
        _iprDataGridView.Columns.Insert((int)Columns.category, comboBoxColumn);
        */

    }
    private void CustomComboBoxColumns(string filter)
        {
            DataGridViewComboBoxColumn ComboBoxColumn = new DataGridViewComboBoxColumn();
            DataTable dt;
            ComboBoxColumn.HeaderText = "category";
            ComboBoxColumn.DataPropertyName = "category";
            ComboBoxColumn.ReadOnly = false;
            ComboBoxColumn.MaxDropDownItems = 100;
            ComboBoxColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
            ComboBoxColumn.FlatStyle = FlatStyle.Flat;
            ComboBoxColumn.ValueMember = "category";
            ComboBoxColumn.DisplayMember = "category";
            _iprDataGridView.Columns.Insert(16, ComboBoxColumn);
            for (int i = 0; i < _iprDataGridView.Rows.Count; i++)
            {
                dt = GetDataForCategory(filter);
             ((DataGridViewComboBoxCell)_iprDataGridView.Rows[i].Cells[16]).DataSource = dt;
             ((DataGridViewComboBoxCell)_iprDataGridView.Rows[i].Cells[16]).DataBind(); //this edit
            }
        }