C# 在运行时将Textboxcell更改为ComboxCell

C# 在运行时将Textboxcell更改为ComboxCell,c#,winforms,datagridview,C#,Winforms,Datagridview,我正在使用MySQL.net连接器使用Mysqladapter和Datagridview.Bindingsource填充Datagridview。这很好,但我想改变一件事: 在填充到DataGridview的表中,有一个文本类型的列。此列中的单元格在datagridview中显示为Datagridviewtextboxcell,但我想将其更改为DataGridViewComboxCell(用户应在~10项之间进行选择) 我已经试过很多次了,但都没有达到应有的效果。DataGridview中的列是

我正在使用MySQL.net连接器使用
Mysqladapter
Datagridview.Bindingsource
填充Datagridview。这很好,但我想改变一件事:

在填充到DataGridview的表中,有一个文本类型的列。此列中的单元格在datagridview中显示为
Datagridviewtextboxcell
,但我想将其更改为
DataGridViewComboxCell
(用户应在~10项之间进行选择)

我已经试过很多次了,但都没有达到应有的效果。DataGridview中的列是只读的,我无法将
DefaultCellTemplate
更改为
DataGridViewComboxCell
,因为它不继承
DataGridviewTextboxcell

我也试过这个:我想我的问题可以通过这种方式解决,但有了这个解决方案,我还有一个问题:它没有显示下拉按钮


任何帮助都将不胜感激。

在您链接的答案中,行前:

dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] = cb;
尝试添加:

cb.DisplayStyle = DataGridViewComboBoxDisplayStyle.CHOOSE_ONE;
cb.FlatStyle = FlatStyle.CHOOSE_ONE;
我不确定你到底想如何设计你的组合框,所以不要“选择一个”,而是尝试一下样式,选择你想要的样式

编辑:似乎您根本没有将其更改为组合框。试试这个:

var values = new List<string> { "a", "b", "c" };
var cell = new DataGridViewComboBoxCell();
cell.DataSource = values;
dataGridView1[col, row] = cell;
var值=新列表{“a”、“b”、“c”};
var cell=新的DataGridViewComboxCell();
cell.DataSource=值;
dataGridView1[col,row]=单元格;

要执行此操作,需要向网格中添加新的DataGridViewComboBoxColumn,然后隐藏文本框列

我在下面使用代码展示了这一点,但您也可以使用设计器进行同样的操作(只需使用设计器设置我在代码中设置的属性)

需要注意的关键事项是:

  • DataPropertyName是指网格数据源的一个属性,很可能是您的文本框源
  • 您需要为列提供自己的数据源
  • DisplayMember和ValueMember指列的数据源
以下是添加列的代码:

// Here I do this in the form constructor - there are other places you can do it
public Form1()
{
    InitializeComponent();

    DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();

    // You need to set some properties on the column to make it work

    // Datasource is the source (usually a list) of objects to show in the combobox
    col.DataSource = dataSource;

    col.DataPropertyName = "ColumnInGridDataSource";
    col.DisplayMember = "DisplayProperty";
    col.ValueMember = "ValueProperty";

    dataGridView1.Columns.Add(col);

    // This hides the textboxcolumn
    dataGridView1.Columns["YourTextBoxColumnName"].Visible = false;
}

您希望此列中的每个单元格都是组合框,还是只希望某些单元格,其余单元格都是文本?我希望此列中的每个单元格都是组合框。Thx,但它不起作用,我尝试了所有的显示样式和平面样式,结果仍然是:我觉得它根本不像组合框。查看编辑。这可能还不错,但如果我这样做的话,使用
MySQLDataAdapter
更新将不再有效。@tearsdontfall为什么不起作用?这段代码设计用于数据绑定-设置DataPropertyName更新备份数据源,然后像以前一样使用dataadapter进行更新。好吧,这可能是我的失败,我在没有更改DataPropertyName和其他属性的情况下完成了C&P。明天再试一次。。。愚蠢的我(:这些属性指的是要用作组合框显示值(向用户显示的内容)和实际值(用于传递到DataPropertyName列的内容)的属性两者都指向列的数据源,而不是网格的数据源。您的意思是显示的属性已经是您想要的了吗?在这种情况下,不必麻烦-value属性可能是必需的,不过,如果它都可以工作,也不必麻烦设置它。