C# C Datagridview-将TextColumn转换为ComboBoxColumn
我有一个包含datagridview控件的windows窗体应用程序。datagridview由xml文件的内容填充。目前,所有列都显示为datagridviewtextboxcolumns。我想选择一个由特定xml标记填充的,并在datagridviewcomboboxcolumn列中显示它的内容以及其他两个选项 例如:C# C Datagridview-将TextColumn转换为ComboBoxColumn,c#,xml,winforms,datagridview,C#,Xml,Winforms,Datagridview,我有一个包含datagridview控件的windows窗体应用程序。datagridview由xml文件的内容填充。目前,所有列都显示为datagridviewtextboxcolumns。我想选择一个由特定xml标记填充的,并在datagridviewcomboboxcolumn列中显示它的内容以及其他两个选项 例如: <SMS> <Number>+447931663542</Number> <DateTime>2009-07-12T17:0
<SMS>
<Number>+447931663542</Number>
<DateTime>2009-07-12T17:00:02</DateTime>
<Message>YES</Message>
<FollowedUpBy>Unassigned</FollowedUpBy>
<Outcome>Resolved</Outcome>
</SMS>
上面的代码填充组合框。问题是:当xml文档填充datagridview时,结果列仅显示为文本框列,包含xml文件中结果标记之间的数据。我的观点是,如何让datagridview在读取结果列时意识到需要将其更改为combobox列,然后以这种方式显示数据,以及combobox中的其他潜在可选选项?!目前,datagridview中填充了所有列,作为包含数据的textboxcolumns,以及一个单独的combobox列,这不是我想要的。我需要应用程序将结果列及其数据与上面的代码合并
有什么想法吗?最新答案
您可以将XML文档传递给一个函数,该函数将循环遍历每个节点,并确定它是否应该是组合框,即名称是否为结果
private void CreateColumns(XmlDocument doc)
{
foreach (...) // loop through each node in xml document
{
if (node.Name == "Outcome")
{
var items = new List<string>() { "Resolved", "Unresolved", "Pending" };
this.dataGridView1.Columns.Add(CreateComboBoxColumn(node.Name, items));
}
else
{
this.dataGridView1.Columns.Add(String.Format("col{0}", node.Name), node.Name);
}
}
}
希望这能有所帮助。我不是坐在VS前面,所以这可能无法编译,但应该会给你指引方向 您需要在设计时使用3-4个可能的值预先填充ResolvedColumn,或者在运行时将其分配给另一个数据源。如果选择设计时方法,只需打开DataGridView“编辑列”对话框,找到ResolvedColumn,转到Items,然后添加值Unresolved、Pending、Resolved。如果有可能使用没有结果的SMS记录呈现网格,则空值可能有助于组合框呈现 要在运行时绑定可能的选项,请执行以下操作:
private List<string> _outcomeDataSource;
private void Form1_Load(object sender, EventArgs e)
{
_outcomeDataSource = new List<string>;
_outcomeDataSource.Add("");
_outcomeDataSource.Add("Unresolved");
_outcomeDataSource.Add("Pending");
_outcomeDataSource.Add("Resolved");
ResolvedColumn.DataSource = _outcomeDataSource;
ResolvedColumn.PropertyName = "Outcome";
}
根据更新的问题为我回答2 您遇到的问题是DataGridView的AutoGeneratedColumns功能。在数据绑定之前,您需要手动创建列。这可以在设计时或运行时完成。我更喜欢设计时,因为它能让你对网格的外观/感觉有更多的了解,但无论哪种方式都可以 您需要禁用网格的AutoGeneratedColumns属性:
private void Form1_Load(object sender, EventArgs e)
{
// Define your columns at run-time here if that's what you prefer
this.dataGridView1.AutoGeneratedColumns = false;
this.dataGridView1.DataSource = myDataSource;
}
CheckBoxColumn引用来自哪里?小心这段代码,因为它会在DataGridView中类型为DataGridViewComboxCell的每一列上被调用!是的,它会在每个被单击的单元格上被调用,但只会由ComboBoxCells单元格处理。您的列表声明是在VB.NET中,而不是在C中,应该是私有列表_outcomeDataSource@James,谢谢你接电话。由于客户的要求,我主要用VB开发,但问题是C语言,所以我在头脑中转换代码。我已更新它以反映您的修复。
public void MyForm_Load(object sender, EventArgs e)
{
var doc = new XmlDocument(filename);
CreateColumns(doc);
CreateRows(doc);
}
private List<string> _outcomeDataSource;
private void Form1_Load(object sender, EventArgs e)
{
_outcomeDataSource = new List<string>;
_outcomeDataSource.Add("");
_outcomeDataSource.Add("Unresolved");
_outcomeDataSource.Add("Pending");
_outcomeDataSource.Add("Resolved");
ResolvedColumn.DataSource = _outcomeDataSource;
ResolvedColumn.PropertyName = "Outcome";
}
private void Form1_Load(object sender, EventArgs e)
{
// Define your columns at run-time here if that's what you prefer
this.dataGridView1.AutoGeneratedColumns = false;
this.dataGridView1.DataSource = myDataSource;
}