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

时间:2013-01-18 19:37:22

标签: c# winforms textbox controls

解决方案

我现在正在努力解决这个问题,但你会在下面的代码中注意到我正在使用Form4的参数化构造函数。 C#中参数化构造函数的标准过程是在声明后使用:this()(我认为,至少对于Forms)。这首先调用unparameterized / default构造函数,其中包含InitializeComponent(),用于设置表单及其控件。

如果您使用InitializeComponent(),那么

:this()绝对应该在参数化构造函数中,因为它会使用“新”控件重新初始化您的表单。这会导致表单和控件的模糊状态,以及我得到的奇怪行为。

原始问题

我有一个表单,我希望控件(包括文本框)在第一个视图上有初始值。这些值来自Form构造期间的SQL语句,因此我无法使用表单设计器。这个表单的元素/控件也是从一个几乎相同的表单中复制粘贴的,因为那个是'Add',这个是'Edit'

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

我尝试在初始化期间,在Load事件和Shown事件中执行此操作,但这些都不起作用。致电Refresh()Application.DoEvents()也没有做任何事情。有什么我想念的吗?某些事件阻止此文本框正确更新/显示?复制粘贴控件是否有意想不到的副作用?

我尝试并以这种方式设置的控件都没有显示更改的值,但textbox是最简单的,因为它没有索引要乱用。

    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;
    }

3 个答案:

答案 0 :(得分:1)

通过函数之间的简单更改(例如Add和Edit),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;
}

你应该好好去。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

我做了一个快速项目来测试这个功能。所有这三个选项都成功设置了TextBox的值。这里有一个问题,发布的代码没有显示。之后某些内容正在更改TextBox值,或者您引用了错误的TextBox。我刚刚调试了与我们的应用程序类似的问题。结果我们以某种方式有两组重叠的TextBoxes(我们实际使用的是一组空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";
    }

答案 2 :(得分:0)

这可能是一个比这个问题更简单的答案,但请确保你实际上是在调用Controls.Add(textBox1)。我注意到目前为止没有人提到这一点。首先签入Designer生成的代码。

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