问题描述
当以编程方式向选项卡控件添加控件时,我一直在使用 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() 按预期工作。