[英]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.