【问题标题】:Breaking Change in DataGridView between .Net 4.0 and .NET 4.7.2 Header Selection.Net 4.0 和 .NET 4.7.2 标题选择之间 DataGridView 的重大变化
【发布时间】:2018-07-25 07:40:39
【问题描述】:

我最近将一个项目从 .NET 4 迁移到 .NET 4.7.2,这引入了 WinForms DataGridView 标头的更改。

预迁移如下所示:

如你所见,我当前点击的单元格的标题没有被选中。 迁移后,相同的 DataGridView 如下所示: 我在Release Notes 处找不到任何提及 WinForms DataGridView 更改的信息

我尝试使用此处的以下代码设置颜色 how to change the color of winform DataGridview header?

this.dgvUserFields.ColumnHeadersDefaultCellStyle.BackColor = System.Drawing.SystemColors.ControlDark;
this.dgvUserFields.EnableHeadersVisualStyles = false;

但代码似乎没有改变任何东西。

是否有一些资源确认了重大更改,以及如何修复它?

【问题讨论】:

  • 这是DataGridViewSelectionMode.FullRowSelect 模式。它现在具有此功能(以指示单元格选择更改)。不过,我不确定这是否适用于所有人。
  • 谢谢你,你有什么详细信息有什么改变吗?或一些来源/解决方案
  • .Net release notes - WinForms。你必须看具体的问题,用数字标记。这属于可访问性改进。亮点与用户主题相关联。另外:Migration Guide to the .NET Framework 4.7, 4.6, and 4.5
  • 也许可以opt out
  • 如果你真的不需要FW 4.7.2,FW 4.7.1.,IIRC,没有这个功能。

标签: c# winforms datagridview


【解决方案1】:

该行为记录在 DataGridView 改进 部分的What's new in accessibility in the .NET Framework 4.7.2 中:

System.Windows.Forms.DataGridView.SelectionMode 设置为 System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect, 列标题将更改颜色以指示当前列为 用户在当前行中的单元格之间切换。

在 .NET Framework 4.7.2 中,当呈现 DataGridViewColumnHeaderCell 时,它会检查列是否为 IsHighlighted,然后将列呈现为推送状态,这是检测 IsHighlighted 的逻辑:

private bool IsHighlighted()
{
    return this.DataGridView.SelectionMode == DataGridViewSelectionMode.FullRowSelect && 
        this.DataGridView.CurrentCell != null && this.DataGridView.CurrentCell.Selected &&
        this.DataGridView.CurrentCell.OwningColumn == this.OwningColumn &&
        AccessibilityImprovements.Level2;
}

正如你在上面的代码中看到的,有&& AccessibilityImprovements.Level2。这意味着如果您关闭该功能,行为将被重置。

Taw 在 cmets 中也提到过,您可以关闭该功能。为此,您可以将此设置块添加到app.config 文件:

<runtime>
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=true" />
</runtime>

【讨论】:

  • 碰巧,您是否测试过我在 cmets 中询问的内容(直接/间接绘制标题)是否可以覆盖此行为?我会自己测试它,但目前我没有一台 4.7.2 的机器。
  • @Jimi 当然自定义油漆可以是一个解决方案。例如,在CellPainting 事件中为标题项目使用视觉样式渲染器:if(e.RowIndex==-1){ renderer.DrawBackground(e.Graphics, e.CellBounds); e.Paint(e.CellBounds, DataGridViewPaintParts.All &amp; (~DataGridViewPaintParts.Background)); e.Handled = true; } 但是为了保持用户的外观和感觉,OP 需要更多的努力,例如处理标题状态(热,正常,按下)。
  • 当然。我想到(下周试驾 4.7.2),鉴于其性质,新行为也可能取代自定义渲染。很高兴知道。谢谢。
【解决方案2】:

这对我有用:

this.dgvUserFields.ColumnHeadersDefaultCellStyle.SelectionBackColor = this.dgvUserFields.ColumnHeadersDefaultCellStyle.BackColor;

【讨论】:

    【解决方案3】:

    由于我不喜欢将 app.config 与独立的可执行文件一起发布,因此我在 program.cs 的 Main() 开头使用这些行来禁用“改进”:

    AppContext.SetSwitch("Switch.UseLegacyAccessibilityFeatures.3", true);
    AppContext.SetSwitch("Switch.UseLegacyAccessibilityFeatures.2", true);
    AppContext.SetSwitch("Switch.UseLegacyAccessibilityFeatures", true);
    

    【讨论】:

      【解决方案4】:

      这对我有用。

      dataGridView1.ColumnHeadersDefaultCellStyle.SelectionBackColor = dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;
      

      【讨论】:

        【解决方案5】:

        这对我有用。在网格的“属性”窗口中:

        1. 将所需的 ColumnHeaderDefaultCellStyle 设置为您希望标题的外观。
        2. 设置 EnableHeaderVisualStyles = false

        【讨论】:

          猜你喜欢
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多