无法以编程方式显示设置的Winforms文本框值

本文关键字:Winforms 文本 设置 显示 编程 方式 | 更新日期: 2023-09-27 17:54:12

解决方案

我现在正在为这个问题而烦恼,但您会在下面的代码中注意到,我正在为Form4使用参数化构造函数。C#中参数化构造函数的标准过程是在声明之后使用:this()(我认为,至少对于Forms是这样(。这首先调用未参数化/默认构造函数,该构造函数包含InitializeComponent(),用于设置窗体及其控件。

如果您使用了:this(),那么InitializeComponent()绝对应该在参数化构造函数中而不是,因为它使用"新"控件重新初始化窗体。这导致了Form和控件的模糊状态,以及我得到的奇怪行为。

原始问题

我有一个表单,我希望控件(包括一个文本框(在第一个视图中具有初始值。这些值来自Form构造过程中的SQL语句,所以我不能使用Form设计器。此表单的元素/控件也是从一个几乎相同的表单复制粘贴的,因为那个表单是"添加",而这个表单是"编辑">

问题是:使用调试器表明我成功地从SQL中获得了良好的数据,并且设置textbox.Text成功,但当显示表单时,它并不能反映所做的更改。答案如下:https://stackoverflow.com/a/7830769/1655707意味着可以简单地设置该值(可能是在初始化或加载期间(。

我尝试过在初始化期间、Load事件和Shown事件中执行此操作,但这些操作都没有成功。调用Refresh()Application.DoEvents()也没有任何作用。我有什么东西不见了吗?某个事件阻止此文本框正确更新/显示?复制粘贴控件是否有意外的副作用?

我尝试以这种方式设置的控件中没有一个显示更改后的值,但文本框是最简单的,因为它没有索引。

    public Form4(int collIDFromParent, string collNameFromParent): this()
    {
        InitializeComponent();
        retCollID = collIDFromParent;
        retCollName = collNameFromParent;
        //Initialize these here so they activate on first use0
        button1.DialogResult = DialogResult.None;
        button2.DialogResult = DialogResult.Cancel;
        //PopulateEditData goes first for potential SQL failure
        PopulateEditData();
        textBox6.Text = "TEST";
    }
    private void Form4_Load_1(object sender, EventArgs e)
    {
        textBox1.Text = "TEST";
    }
    private void Form4_Shown_1(object sender, EventArgs e)
    {
        textBox2.Text = "TEST";
    }

是的,他们设置了不同的文本框,但都不起作用,所以没有什么区别。

典型的textBox更改处理程序。有人可能会认为,它目前的编写方式可能会调用某种重置,但注释一行并不能改变我担心的行为。

    private void textBox6_TextChanged_2(object sender, EventArgs e)
    {
            retCollName = textBox6.Text;
    }

无法以编程方式显示设置的Winforms文本框值

通过在函数之间进行简单的更改(如添加与编辑(,Form的核心功能不会改变。您试图处理的两个函数之间的唯一核心区别是一个新对象和一个现有对象。正因为如此,一个单一的表单会比两个单独的表单更好。它还节省了大量的工作,并且是OOP的核心之一。

我建议的另一件事是在创建表单之前检索数据。创建一个数据对象,其中包含从数据库中检索的所有属性。为该数据类提供一个Load方法,该方法接受您要查找的记录的任何标识符。现在,您可以轻松应对。

为了举例,我将在这里制作一些默认按钮,您的经验可能会有所不同。:(

AddButton_Click(//default button click parameters) {
    Widget widget = new Widget();
    OpenWidgetForm(widget);
}
EditButton_Click(//default button click parameters) {
    Widget widget = new Widget();
    // You'll use the way you have now to determine which record to load,
    // and turn it to the id variable
    widget.Load(id);
    OpenWidgetForm(widget);
}
OpenWidgetForm(Widget widget) {
    frmWidget frm = new frmWidget(widget);
    frm.Show();
}

该代码将以您所拥有的带您进入"添加/编辑"表单的任何形式出现。

现在,在您的添加/编辑表单中,您将对其进行如下更改:

private Widget _widget;
public frmWidget() {
    Widget widget = new Widget();
    _widget = widget;
    LoadWidget();
}
public frmWidget(Widget widget) {
    _widget = widget;
    LoadWidget();
}
public void LoadWidget() {
    // go through each of the properties of your object
    // and set the values to the Text properties of each Textbox.
    txtName.Text = _widget.Name;
}

有了这些,你应该可以走了。如果你有任何问题,请告诉我。

我做了一个快速项目来测试这个功能。这三个选项都成功地设置了TextBox的值。您在这里有一个问题,发布的代码没有显示出来。之后可能有什么东西更改了TextBox值,或者您引用了错误的TextBox。我刚刚调试完应用程序中的一个类似问题。事实证明,我们有两组重叠的文本框(我们实际使用的文本框位于一组空文本框下面(。

    public Form1()
    {
        InitializeComponent();
        textBox1.Text = "TEST";
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        textBox2.Text = "TEST";
    }
    private void Form1_Shown(object sender, EventArgs e)
    {
        textBox3.Text = "TEST";
    }

这可能是一个比这个问题所需的更琐碎的答案,但请确保您实际上正在调用Controls.Add(textBox1)。到目前为止,我注意到没有人提到这一点。请先签入设计器生成的代码。

如果要动态添加控件,则必须自己调用它。