如何在dataGridView中对Combox进行编程?
以下代码不会导致结果。
Datatable中的数据表parsitsya。
我要在“类型”字段中显示“ combox”
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;
}
答案 0 :(得分:0)
我相信问题是您的“国家”不可见,而且它必须是财产。 考虑以下代码:
private ObservableCollection<string> _Countries;
public ObservableCollection<string> Countries
{
get { return _Countries; }
set { _Countries = value; }
}
在您的Form5_Load中初始化并设置其内容,看看它是否有效。
编辑1:
我很好奇,所以我实际上创建了一个项目并试图重现该问题,并且我认为真正的问题是根据从DB获得的信息填充了DataGridView。我进一步研究了一下,并在SO上找到了这篇文章:
C# Replace default textbox in DataGridView with a Combobox
根据它的数据,已经根据您的数据将其创建为DataGridView TextBox 列,因此无法将其类型更改为DataGridView ComboBox Column从DB获得。它还提出了两种不同的解决方案,听起来确实很现实。我希望你能弄清楚,祝你好运。
编辑2:
根据您的请求,我将尝试通过更改从数据库获取的数据来找到实现此目标的方法。
在下面的代码中,您有一个“ 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);
然后,您只需删除/删除从数据库获取的无关的“类型”列即可。但是,在此过程中,您将面临其他一些问题,例如将组合框中的所选对象连接到行中的其他数据。它并不复杂,但是会变得相对难看。
答案 1 :(得分:0)
已编辑:
如果您设置了 [HttpPost]
public IActionResult CBack([RequiredFromQuery]string id,
[FromBody] Newtonsoft.Json.Linq.JObject Cypher)
并且列是自动生成的,则列“ type” 的类型不是ComboBox。在这种情况下,您可以创建一个新列,进行设置,然后用它替换旧列:
DataGridView.AutoGenerateColumns = true
先前的代码不起作用,因为无法将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
将返回null,并且由于将代码放入Form_Load中,因此省略了Exception。
原始
:尝试一下:
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn)