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