winforms DataGridView在.NET 4.0和.NET 4.7.2标头选择之间的突破性更改

oknwwptz  于 2023-02-09  发布在  .NET
关注(0)|答案(8)|浏览(188)

我最近将一个项目从.NET 4迁移到.NET 4.7.2,这在WinForms DataGridView头中引入了一个更改。
预迁移如下所示:

如您所见,当前单击的单元格的Header未被选中。迁移后,相同的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;

但代码似乎没有改变任何东西。
一些资源是否证实了这种破坏性的变化,以及如何修复它?

odopli94

odopli941#

此行为记录在 *DataGridView改进 * 中的.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在评论中提到的,你可以关闭这个功能,为此,你可以将这段设置添加到app.config文件中:

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

olmpazwi2#

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

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

9njqaruj3#

我的工作是:

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

lb3vh1jj4#

这对我有用。

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

de90aj5v5#

这对我很有效。在网格的“属性”窗口中:
1.将所需的ColumnHeaderDefaultCellStyle设置为您希望标题的任何外观。
1.设置启用标题可视化样式=假

r8uurelv

r8uurelv6#

添加到Reza's answer
随着. NET Framework 4.8的出现,有了一个新的辅助功能改进级别:AccessibilityImprovements.Level3
因此,当添加到您的app.config:

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

那么在应用程序启动期间,您可能会遇到此异常:
System.NotSupportedException:"桌面应用程序需要选择加入所有早期的辅助功能改进才能获得以后的改进。为此,请确保如果AppContext开关" Switch. UseLegacyAccessibilityFeatures. N "设置为" false ",则" Switch. UseLegacyAccessibilityFeatures "和所有" Switch. UseLegacyAccessibilityFeatures. M "开关在M〈N时也计算为false。请注意,如果用于特定辅助功能改进集的开关不存在,则其值由目标Framework版本确定。您可以通过添加这些开关并将其值设置为false来解决此问题。'
要解决此问题,您还必须选择退出第3级:

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

请注意:
如果你已经应用了KB4569746 Cumulative Update for .NET Framework 4.8,那么你可能也必须选择退出第4级。

fhg3lkii

fhg3lkii7#

dgvUserFields.启用标题可视化样式=假;

将此添加到表单加载事件中

wnavrhmk

wnavrhmk8#

禁用“改进”确实起到了作用,但由于某种原因导致了其他问题。
我有几个表单有这个问题,而且随着应用程序的增长,还会添加更多表单。因此,我创建了自己的自定义DataGridView来处理DataGridView的ColumnStateChanged事件,并将HeaderCell的Style重置为默认背景值,这样我就不必在每个新表单上添加此行/handle事件。
1.创建应用程序要使用的自定义DataGridView。
1.在构造函数中,可以处理DataGridView的ColumnStateChanged事件,并将HeaderCell的Style重置为默认背景值:
例如(我实际上已经有一个自定义网格的其他原因,如搜索过滤):

public class DataGridViewCustom : DataGridView
  {
    public DataGridViewSearch() : base()
    {
      InitializeComponent();
  
      this.ColumnStateChanged += DataGridViewCustom_ColumnStateChanged;
    }
  
    private void DataGridViewCustom_ColumnStateChanged(object sender, DataGridViewColumnStateChangedEventArgs e)
    {
      DataGridView dataGridView = (DataGridView)sender;
      //Only update for full row selection mode.
      if (dataGridView.SelectionMode == DataGridViewSelectionMode.FullRowSelect)
      {
        e.Column.HeaderCell.Style.SelectionBackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;
      }
    }
  }

相关问题