C# C Datagridview-将TextColumn转换为ComboBoxColumn

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

我有一个包含datagridview控件的windows窗体应用程序。datagridview由xml文件的内容填充。目前,所有列都显示为datagridviewtextboxcolumns。我想选择一个由特定xml标记填充的,并在datagridviewcomboboxcolumn列中显示它的内容以及其他两个选项

例如:

<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;
}