【问题标题】:C# Datagridview - Convert TextColumn to ComboBoxColumnC# Datagridview - 将 TextColumn 转换为 ComboBoxColumn
【发布时间】:2009-07-13 11:22:14
【问题描述】:

我有一个包含 datagridview 控件的 Windows 窗体应用程序。 datagridview 由 xml 文件的内容填充。目前,所有列都显示为 datagridviewtextboxcolumns。我想选择一个由特定 xml 标签填充的标签,并将其内容与其他 2 个选项一起显示在 datagridviewcomboboxcolumn 中。

示例:

<SMS>
<Number>+447931663542</Number> 
<DateTime>2009-07-12T17:00:02</DateTime> 
<Message>YES</Message> 
<FollowedUpBy>Unassigned</FollowedUpBy> 
<Outcome>Resolved</Outcome>
</SMS>

OUTCOME 标记是我希望在 datagridview 中显示为组合框列的列。例如,如果标签为空且不包含任何数据,那么我不想显示任何内容,但在组合框列中填充了 3 个可能的选项供您选择(未解决、已解决、待处理)。但是,如果标签包含数据,我希望该特定项目显示在组合框列中,并且可以选择其他两个选项。

我们将不胜感激!

问候,

编辑: 目前我使用这个代码:

     colOutcome = new DataGridViewComboBoxColumn();
        colOutcome.HeaderText = "Outcome";
        colOutcome.Width = 90;
        colOutcome.Items.AddRange("Resolved", "Unresolved", "Pending");
        this.dataGridView1.Columns.Insert(1, colOutcome);
        this.dataGridView1.Columns[1].Name = "OutcomeColumn";

上面的这段代码填充了组合框。问题是:当 xml 文档填充 datagridview 时,结果列仅显示为文本框列,其中包含 xml 文件中结果标记之间的数据。我的观点是,我怎样才能让 datagridview 在读取结果列时意识到它需要更改为组合框列,然后以这种方式显示数据,以及组合框中的其他潜在可选选项?!目前,datagridview 填充了所有列作为包含数据的文本框列,以及一个单独的组合框列,这不是我想要的。我需要应用程序将结果列及其数据与上面的代码合并。

有什么想法吗?

【问题讨论】:

    标签: c# xml winforms datagridview


    【解决方案1】:

    更新答案

    您可以将 XML 文档传递给一个函数,该函数将遍历每个节点并确定它是否应该是 ComboBox 之一,即名称是否为“Outcome”。

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

    那么您创建结果列的代码将是:

    private DataGridViewComboBoxColumn CreateComboBoxColumn(string colHeaderText, List<string> items)
    {
        var colOutcome = new DataGridViewComboBoxColumn(); 
        colOutcome.HeaderText = colHeaderText; 
        colOutcome.Width = 90; 
        colOutcome.Items.AddRange(items.ToArray());
        colOutcome.Name = String.Format("col{0}", colHeaderText);
        return colOutcome;   
    }
    

    然后,您只需在表单加载事件上调用 CreateColumns 并传入您的 XML。您应该只需要创建一次列。

    我的建议是使用一个类似的函数来查找所有 SMS 元素并添加一个新行来填充每个节点中的信息。

    public void MyForm_Load(object sender, EventArgs e)
    {
         var doc = new XmlDocument(filename);
         CreateColumns(doc);
         CreateRows(doc);
    }
    

    希望对您有所帮助。

    【讨论】:

    • CheckBoxColumn 引用从何而来?请注意此代码,因为它将在 DataGridView 中属于 DataGridViewComboBoxCell 类型的每一列上调用。
    • 错字本来就是 ​​ComboBoxCell!是的,它会在每个被点击的单元格上被调用,但只会由 ComboBoxCells 的单元格处理。
    【解决方案2】:

    根据更新后的问题为我回答 #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;
    }
    

    【讨论】:

      【解决方案3】:

      我没有坐在 VS 前面,所以这可能无法编译,但应该给你指导。

      您需要在设计时使用 3-4 个可能的值预先填充 ResolvedColumn,或者在运行时将其分配给另一个数据源。如果您选择设计时方法,只需打开 DataGridView“编辑列”对话框,找到 ResolvedColumn,转到 Items,然后添加您的值(“”、“Unresolved”、“Pending”、“Resolved”)。如果有可能使用没有结果的 SMS 记录呈现网格,则空值可能有助于 ComboBox 呈现。

      要在运行时绑定可能的选项,请执行以下操作:

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

      【讨论】:

      • 您的 List 声明是在 VB.NET 而不是 C# 中,应该是私有 List _outcomeDataSource
      • @James,感谢您了解这一点。由于客户的要求,我主要在 VB 中开发,但问题是在 C# 中,所以我在脑海中转换代码。我已对其进行了更新以反映您的修复。
      猜你喜欢
      • 1970-01-01
      • 2018-04-15
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2016-03-28
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多