C# WinForm TabControl 格式问题

问题描述

当以编程方式向选项卡控件添加控件时,我一直在使用 Form_Load 事件来创建数据网格视图之类的内容并将其嵌入到我的 UI 中。我做了一个继承自 DataGridView 的类

class DBDataGridView : DataGridView
{
    public DBDataGridView()
    {
        DoubleBuffered = true;
        AllowUserToAddRows = false;
        AllowUserToDeleteRows = false;
        AllowUserToResizeRows = false;
        AllowUserToOrderColumns = false;
        AllowUserToResizeColumns = false;
        RowHeadersVisible = false;
        AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        ReadOnly = true;
        Dock = DockStyle.Fill;
        SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        TabStop = false;
    }
}

我稍后会像这样在 Form_Load 事件中调用

    private void MainDesignerForm_Load(object sender,EventArgs e)
    {
        DBDataGridView _DGV = new DBDataGridView();

        var listofOverlays = new List<OverlaySelectionList>()
        {
            new OverlaySelectionList { Description = "Description 1",PartNumber = "123-R1"},new OverlaySelectionList { Description = "Description 2",PartNumber = "456-R1"}
        };
        var overlayList = new BindingList<OverlaySelectionList>(listofOverlays);
        _DGV.DataSource = overlayList;
        Tab_Overlay.Controls.Add(_DGV);
        _DGV.ClearSelection();
    }

这个网格视图位于 TabControl 的第三个选项卡上,除了 ClearSelection() 之外,一切都按预期工作。无论我在哪里调用它,它都不会清除 DGV 的初始行选择。但是,如果我从第三个选项卡上的按钮触发相同的代码块,则格式和 ClearSelection() 的行为将符合预期。

是什么导致了这种行为?

解决方法

感谢 41686d6564 和 Jimi 深入了解发生这种情况的具体原因。

重申他们在评论中所说的话:属性的分配似乎被缓存,无论它们所属的控件是否处于活动状态(因此所有大小和格式属性都在运行时出现)。但是,需要句柄的操作(例如 ClearSelection())需要显示控件并使其处于活动状态,以便观察到预期的行为。

在调用 ClearSelection() 之前将选定的选项卡设置为 DataGridView 的位置是解决方案(或者在我的情况下,我有嵌套的选项卡,所以我必须按照选项卡树到达 DataGridView 所在的特定选项卡)

所以现在,Load_Form 逻辑的一部分是检查控件所在的位置,激活该选项卡,然后格式化并清除正在添加的每个控件的选择。这允许 ClearSelection() 按预期工作。