繁体   English   中英

如何在dataGridView中编程Combox?

[英]How to program Combox in dataGridView?

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

Datatable 中的数据表 parsitsya。
我想让“类型”字段显示“组合框”

在此处输入图片说明 代码

  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;

        }

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

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

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

编辑 1:

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

C# 用组合框替换 DataGridView 中的默认文本框

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

编辑2:

根据您的要求,我将尝试通过更改您从 DB 获得的数据来找出实现它的方法。

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

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

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

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

在此处输入图片说明

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

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn();

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

dataGridView2.Columns.Add(newColumn);

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

编辑:

如果您设置了DataGridView.AutoGenerateColumns = true并且自动生成列,则列“类型”的类型不是 ComboBox。 在这种情况下,您可以创建一个新列,进行设置,然后用它替换旧列:

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所以(dataGridView1.Columns[1] as DataGridViewComboBoxColumn)会返回一个 null 并且因为你已经把代码放在 Form_Load 中,所以忽略了异常。

原来的:

尝试这个:

int i = 0;
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = countrys.Select(x=> new {Key = i++, Value = x}).ToList();
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DisplayMember = "Value";
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).ValueMember = "Key";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM