问个基础问题:给窗体类赋值

6lilu9 2018-11-14 11:00:00
我记得老师一直这么教我的,今天怎么都不行,都快颠覆三观了,请高手看看哪里错了。

程序很简单:新建一个窗体应用程序,窗体上放置一个默认Textbox1控件,另外类内设一个字符串字段,想达到在主线程内给调用窗体控件赋值的目的。
主程序:
       

namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Form1 form1 = new Form1()
{
TextboxText = "主线程赋值",
};
Application.Run(form1);
}
}
}



窗体类

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

textBox1.Text = TextboxText;
// textBox1.Text = "类内赋值";
}
}


预想结果:Textbox控件内值为"主线程赋值"
实际结果:Textbox控件内值为空,
请解祸。
...全文
67 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2018-11-16
  • 打赏
  • 举报
回复
把:textBox1.Text = TextboxText;放Load Form事件里
Stiven_PFan 2018-11-16
  • 打赏
  • 举报
回复
把TextBoxText设为一个属性:
private string textBoxText;
public string TextBoxText
{
get:
{
return textBoxText;
}
set:
{
textBoxText=value;
textBox1.Text=textBoxText;
}
}
}
  • 打赏
  • 举报
回复
如果你的新“窗体值”跟内部控件的值绑定在一起(设计为属性的形式),那么你就不用离散的两个变量谁先谁后调用的问题。反之如果你“迫不得已”只能看作是多个离散的变量,那么你就要多花精力来测试谁先谁后设置问题,甚至你需要额外封装一个属性来屏蔽这种差异(例如用额外地属性,来同时绑定到那两个原本各自自由散漫地设计出来的东西上)。所以这里体现了首先升级你的设计模式,稍微费一点脑筋,将来再来理解和维护代码就节省力气了。
大然然 2018-11-15
  • 打赏
  • 举报
回复
Form1哪个时候都还没有真正的“显示”出来
  • 打赏
  • 举报
回复
要为对象设置业务属性,需要跟控件进行实时的绑定。例如
private string _TextboxText;

public string TextboxText
{
    get
    {
        return _TextboxText;
    }
    set
    {
        _TextboxText = value;
        this.TextBox1.Text = value;
    }
}
要从模式的高度来理解。不能用一堆零撒的代码来拼凑逻辑。
  • 打赏
  • 举报
回复
你首先执行了
textBox1.Text = TextboxText;
然后给 TextboxText 赋值,这基本上是属于自己弄的 TextboxText 这么个变量出现的问题。但是从 UI 逻辑设计上看,既然你弄了类似 TextboxText 这种东西,它 改变时也应该实时地设置到 UI 控件。多弄出一个东西反而不能同步值,这其实自找麻烦。
  • 打赏
  • 举报
回复
textBox1.Text = TextboxText;
这类 UI 显示操作代码,应该放到 Form_Load 事件处理或者这个事件处理完毕之后,才执行。
良朋 2018-11-14
  • 打赏
  • 举报
回复
另外搞一个class,尽量别修改主Program
张天星 2018-11-14
  • 打赏
  • 举报
回复
       

namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Form1 form1 = new Form1("主线程赋值") //构造传参
{
};
Application.Run(form1);
}
}
}



窗体类

public partial class Form1 : Form
{
public string TextboxText;
public Form1(string text)
{
InitializeComponent();
textBox1.Text = text;
}
}


用构造方法传参
sdfgrtyu 2018-11-14
  • 打赏
  • 举报
回复
引用 0 楼 lengyeshuang 的回复:
我记得老师一直这么教我的,今天怎么都不行,都快颠覆三观了,请高手看看哪里错了。

程序很简单:新建一个窗体应用程序,窗体上放置一个默认Textbox1控件,另外类内设一个字符串字段,想达到在主线程内给调用窗体控件赋值的目的。
主程序:
       

namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Form1 form1 = new Form1()
{
TextboxText = "主线程赋值",
};
Application.Run(form1);
}
}
}



窗体类

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

textBox1.Text = TextboxText;
// textBox1.Text = "类内赋值";
}
}


预想结果:Textbox控件内值为"主线程赋值"
实际结果:Textbox控件内值为空,
请解祸。

不会算命啊,,,,,
浩气IT 2018-11-14
  • 打赏
  • 举报
回复
Form1构造函数先执行,TestboxText没有值
牧歌ing 2018-11-14
  • 打赏
  • 举报
回复
你可以了解一下c#中的属性
enaking 2018-11-14
  • 打赏
  • 举报
回复
你这个不能在窗体的构造函数里赋值,应该去窗体的shown事件赋值 ,据我经验好像command控件的选择值都在窗体的load事件设置也同样不起作用,可能构造函数里,控件还没有被构造或者又被重新初始化了,反正不行,或许是一bug。
enaking 2018-11-14
  • 打赏
  • 举报
回复
你这个不能在窗体的构造函数里赋值,应该去窗体的shown事件赋值 ,据我经验好像command控件的选择值都在窗体的load事件设置,可能构造函数里,控件还没有被构造或者又被重新初始化了,反正不行,或许是一bug。
6lilu9 2018-11-14
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
要为对象设置业务属性,需要跟控件进行实时的绑定。例如
private string _TextboxText;

public string TextboxText
{
    get
    {
        return _TextboxText;
    }
    set
    {
        _TextboxText = value;
        this.TextBox1.Text = value;
    }
}
要从模式的高度来理解。不能用一堆零撒的代码来拼凑逻辑。
谢谢,理解了。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧