如何在dataGridView中编程Combox?

时间:2018-10-14 12:20:53

标签: c# winforms

如何在dataGridView中对Combox进行编程?
以下代码不会导致结果。

Datatable中的数据表parsitsya。
我要在“类型”字段中显示“ combox”

enter image description here 代码

  DataTable dt;        

OleDbConnection connection;
OleDbDataAdapter adapter;
OleDbCommandBuilder commandBuilder;


        static string catBD = @"z:\vs\csharp\prb\db_GridVAccess.accdb";
        string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", catBD);

        string sql = "SELECT * FROM tbl_01_Combox";

        public Form5()
        {
            InitializeComponent();


            using (OleDbConnection cn = new OleDbConnection())
            {
                connection = new OleDbConnection(connectionString);
                connection.Open();

                adapter = new OleDbDataAdapter(sql, connection);

                commandBuilder = new OleDbCommandBuilder(adapter);

                // На соновании DataTable
                dt = new DataTable();
                adapter.Fill(dt);
                dataGridView1.DataSource = dt;
            }
        }

        private void Form5_Load(object sender, EventArgs e)
        {
            // Ширина поля            
            dataGridView1.Columns[0].Width = 50;

            // Комбокс
            string[] countrys = new string[] { "США", "ОАЭ", "ЮАР" };
            (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = countrys;

        }

2 个答案:

答案 0 :(得分:0)

我相信问题是您的“国家”不可见,而且它必须是财产。 考虑以下代码:

private ObservableCollection<string> _Countries;    
public ObservableCollection<string> Countries
{
    get { return _Countries; }
    set { _Countries = value; }
}

在您的Form5_Load中初始化并设置其内容,看看它是否有效。

编辑1:

我很好奇,所以我实际上创建了一个项目并试图重现该问题,并且我认为真正的问题是根据从DB获得的信息填充了DataGridView。我进一步研究了一下,并在SO上找到了这篇文章:

C# Replace default textbox in DataGridView with a Combobox

根据它的数据,已经根据您的数据将其创建为DataGridView TextBox 列,因此无法将其类型更改为DataGridView ComboBox Column从DB获得。它还提出了两种不同的解决方案,听起来确实很现实。我希望你能弄清楚,祝你好运。

编辑2:

根据您的请求,我将尝试通过更改从数据库获取的数据来找到实现此目标的方法。

在下面的代码中,您有一个“ dt”对象,该对象包含要在DataGridView中显示的数据。

dt = new DataTable();    
adapter.Fill(dt);
dataGridView1.DataSource = dt;

我从来没有自己做过,也无法以任何方式快速地重新创建它,但是我建议您尝试使用对象“ dt”的内容。我想发生在“ adapter.Fill”中的代码根据db中的数据创建DataTable,您可以尝试在其中添加一些代码,该代码将为“ type”列添加一个List而不是一个字符串(它将为您提供帮助)据我所知,创建一个ComboBoxColumn而不是TextBoxColumn)。我现在实际上检查了它,它看起来有点复杂,但是我真的不知道您的程序中正在发生什么,这可能很容易。

无论如何,我确实尝试过另一种方式,而不是更改现有的列类型,而是在自动填充的DataGridView的末尾添加了自己的新DataGridViewComboBoxColumn:

enter image description here

DataTable dt = new DataTable();
dataGridView2.DataSource = dt;

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn();

newColumn.DataSource = new List<string> { "asd", "qwe", "zxc" };

dataGridView2.Columns.Add(newColumn);

然后,您只需删除/删除从数据库获取的无关的“类型”列即可。但是,在此过程中,您将面临其他一些问题,例如将组合框中的所选对象连接到行中的其他数据。它并不复杂,但是会变得相对难看。

答案 1 :(得分:0)

已编辑:

如果您设置了 [HttpPost] public IActionResult CBack([RequiredFromQuery]string id, [FromBody] Newtonsoft.Json.Linq.JObject Cypher) 并且列是自动生成的,则列“ type” 的类型不是ComboBox。在这种情况下,您可以创建一个新列,进行设置,然后用它替换旧列:

DataGridView.AutoGenerateColumns = true

先前的代码不起作用,因为无法将DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn(); int i = 0; column.DataPropertyName = "type"; column.DataSource = countrys.Select(x => new { Key = i++, Value = x }).ToList(); column.DisplayMember = "Value"; column.ValueMember = "Key"; dataGridView1.Columns.RemoveAt(1); dataGridView1.Columns.Insert(1, column); 强制转换为column[1],因此DataGridViewComboBoxColumn将返回null,并且由于将代码放入Form_Load中,因此省略了Exception。

原始

尝试一下:

(dataGridView1.Columns[1] as DataGridViewComboBoxColumn)