C# WinForm TabControl 格式化问题
C# WinForm TabControl Formatting Issue
当以编程方式将控件添加到选项卡控件时,我一直在使用 Form_Load 事件来创建数据网格视图之类的东西并将其嵌入到我的 UI 中。我做了一个继承自 DataGridView
的 class
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();
}
此 gridview 位于 TabControl 的第三个选项卡上,除了 ClearSelection() 之外,一切都按预期工作。无论我在哪里调用它,它都不会清除 DGV 的初始行选择。但是,如果我从第三个选项卡上的按钮触发相同的代码块,格式和 ClearSelection() 将按预期运行。
是什么导致了这种行为?
感谢 41686d6564 和 Jimi 深入了解发生这种情况的具体原因。
重申他们在评论中所说的话:属性的分配似乎被缓存,无论它们所属的控件是否处于活动状态(因此,为什么所有的大小和格式属性都在 运行 时间出现).但是,需要句柄的操作(如 ClearSelection())需要显示控件并使其处于活动状态才能观察到预期的行为。
在调用 ClearSelection() 之前将选定的选项卡设置到 DataGridView 所在的位置是解决方案(或者在我的情况下,我有嵌套的选项卡,所以我必须按照选项卡树找到 DataGridView 所在的特定选项卡上)
所以现在,Load_Form 逻辑的一部分是检查控件所在的位置,使该选项卡处于活动状态,然后格式化并清除要添加的每个控件的选择。这允许 ClearSelection() 按预期工作。
当以编程方式将控件添加到选项卡控件时,我一直在使用 Form_Load 事件来创建数据网格视图之类的东西并将其嵌入到我的 UI 中。我做了一个继承自 DataGridView
的 classclass 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();
}
此 gridview 位于 TabControl 的第三个选项卡上,除了 ClearSelection() 之外,一切都按预期工作。无论我在哪里调用它,它都不会清除 DGV 的初始行选择。但是,如果我从第三个选项卡上的按钮触发相同的代码块,格式和 ClearSelection() 将按预期运行。
是什么导致了这种行为?
感谢 41686d6564 和 Jimi 深入了解发生这种情况的具体原因。
重申他们在评论中所说的话:属性的分配似乎被缓存,无论它们所属的控件是否处于活动状态(因此,为什么所有的大小和格式属性都在 运行 时间出现).但是,需要句柄的操作(如 ClearSelection())需要显示控件并使其处于活动状态才能观察到预期的行为。
在调用 ClearSelection() 之前将选定的选项卡设置到 DataGridView 所在的位置是解决方案(或者在我的情况下,我有嵌套的选项卡,所以我必须按照选项卡树找到 DataGridView 所在的特定选项卡上)
所以现在,Load_Form 逻辑的一部分是检查控件所在的位置,使该选项卡处于活动状态,然后格式化并清除要添加的每个控件的选择。这允许 ClearSelection() 按预期工作。