【问题标题】:How to program Combox in dataGridView?如何在 dataGridView 中对 Combox 进行编程?
【发布时间】:2018-10-14 12:20:52
【问题描述】:

如何在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;

        }

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我认为问题在于您的“国家/地区”不可观察,而且它必须是属性。 考虑以下代码:

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

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

    编辑 1:

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

    C# Replace default textbox in DataGridView with a Combobox

    据此,您不能将列的类型更改为DataGridViewComboBoxColumn,在它已经根据您的数据创建为DataGridViewTextBoxColumn之后从数据库得到。它还提出了两种不同的处理方法,听起来确实很现实。我希望你能弄明白,祝你好运。

    编辑 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.type 获得的不相关的“类型”列。但是,在此过程中您将面临一些其他问题,例如将组合框中的选定对象连接到行中的其他数据。它并不复杂,但会变得相对丑陋。

    【讨论】:

    • 我会试着弄清楚。你的意思是答案是“Junaith”?通过代码示例来证明“Junaith”的答案对您来说可能并不难。我试图在“for”循环中回答“en-user”。但它不起作用....给出错误消息。
    【解决方案2】:

    已编辑:

    如果你设置了DataGridView.AutoGenerateColumns = true,并且列是自动生成的,那么列"type"的类型不是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";
    

    【讨论】:

    • 没有错误,显示了网格,但是combox没有出现在网格中。 dataGridView1.DataSource = dt; string[] countrys = new string[] { "США", "ОАЭ", "ЮАР" }; int i = 0; (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = countrys.Select(x =&gt; new { Key = i++, Value = x }).ToList(); (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DisplayMember = "Value"; (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).ValueMember = "Key";
    • 您是否在 AutoGenerateColumns 上设置了 DataGridView?
    • 效果不佳....也许我问错了问题?没想到会有这么大的问题……不知怎的,一切都变得很困难……codeshare.io/Gbjxobyoutu.be/FOU8XsKVgEw
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2021-02-19
    相关资源
    最近更新 更多