gpt4 book ai didi

C# 为什么不能在 winform 构造函数中设置 GUI 特定操作?

转载 作者:行者123 更新时间:2023-11-30 18:08:25 31 4
gpt4 key购买 nike

我想知道为什么不能在 winform 的构造函数中设置某些属性。例如,我有一个 Expandable splitter(devcomponents 库),当我将属性 Expanded 设置为 false 时,在构造函数中没有任何反应,但是当我将相同的代码放入表单加载事件时,它起作用了像预期的那样。我将此代码放在 InitializeComponent() 方法之后。

另一种情况,虽然略有不同,是这样的。当您在类中动态创建组合框并将选定的索引设置为第一项以外的内容,然后返回此组合框时,选定的索引将在表单上设置回 1。

这是为什么?

第一种情况的代码片段(已更新):

// This works in the form_load event but not in the form constructor (after InitializeComponent())
if (_tabId != -1)
{
this.SuspendLayout();
expandableSplitter1.SuspendLayout();

expandableSplitter1.Expanded = false;
expandableSplitter1.Enabled = false;

// Hide all tabs, except the selected tab
tabControl1.Tabs.Clear();

QuestionTab tab = new QuestionTab(_tabId);

TabItem tabItem = tabControl1.CreateTab(tab.Description);
tabItem.Tag = tab;

tabControl1.SelectedTabIndex = 0;

TabItem_Click(tabItem, null);

expandableSplitter1.ResumeLayout(true);
this.ResumeLayout(true);
}

第二种情况的代码片段:

public Control GenerateList(Question question)
{
// some code is omitted

ComboBox cmb = new ComboBox();

cmb.SuspendLayout();

cmb.Name = "cmb";
cmb.DisplayMember = "Answer";
cmb.ValueMember = "Id";
cmb.DataSource = answers;
cmb.Dock = DockStyle.Top;

cmb.SelectedValue = 3; // not the first index


cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);

cmb.ResumeLayout(true);

return cmb;
}

最佳答案

问题是,这些属性有副作用。这将导致控件失效,它会尝试重绘自身,但这不起作用,因为实际上我们在构造函数中,没有任何东西可以绘制。从而导致切换回以前的值或默认值(取决于具体控件的实现)。

要使其正常工作,您应该仔细研究 InitializeComponent() 函数。在开始设置控件内的任何内容之前,它会调用 Control.SuspendLayout(),然后调用 Control.ResumeLayout(false)

您应该做同样的事情,但不仅限于控件本身,还包括所有父控件(可能是 TableLayoutPanel 或任何其他容器控件),直到通过调用 this.SuspendLayout() 到达顶部>.

您还应该注意顺序。从顶部控件(this)暂停到您喜欢的确切控件,然后以相反的顺序继续。在标准窗口控件的情况下,这应该可以工作。如果您使用任何第 3 方控件,则由供应商负责。

更新

阅读您的更新和评论后,我创建了一个新项目,在其中放置了一个带有一些页面的 TabControl。我还在第三页上放了一个 ComboBox 并向其中添加了一些项目。

然后我改变了我的代码如下:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

tabControl1.SelectedIndex = 1;
comboBox1.SelectedIndex = 2;
}
}

它按预期工作(不使用 SuspendLayout()ResumeLayout())。

因此,要真正找到应用程序中的错误,请启动一个新的空应用程序并开始用现有代码填充它,或者只使用 OnLoad() 方法。

关于C# 为什么不能在 winform 构造函数中设置 GUI 特定操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3185917/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com