簡體   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