我有一个winform,我想将一系列字符串传递给一系列标签。
这是代码:
public partial class CourierDeliveringEnemyReport : Form
{
public static string Label1 { get; set; }
public static string Label2 { get; set; }
public static string Label3 { get; set; }
public static string Label4 { get; set; }
public static string Label5 { get; set; }
public string Label6 { get; set; }
public CourierDeliveringEnemyReport()
{
InitializeComponent();
label1.Text = Label1;
label2.Text = Label2;
label3.Text = Label3;
label4.Text = Label4;
label5.Text = Label5;
label6.Text = "This is a test!";
}
值设置在这里:
CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport();
CourierDeliveringEnemyReport.Label1 = "Report from " + BlueArmy[GameEventList[i].ObservingUnit].Name; ;
string temp2 = "Enemy unit (" + RedArmy[GameEventList[i].Unit].Name + ") observed!";
CourierDeliveringEnemyReport.Label2 = temp2;
string temp3 = "This intelligence is " + RedArmy[GameEventList[i].Unit].LastTimeObservedByEnemy + " minutes old.";
CourierDeliveringEnemyReport.Label3 = temp3;
使用调试器我可以确认传递了有效的字符串。例如,Label1包含字符串“Report from ...”。
问题是标签不采用除label6(测试用例)之外的字符串值。
我做错了什么?
谢谢!
答案 0 :(得分:2)
您不是binding
变量的标签,您只需设置一次。您似乎期望标签在相关LabelX
字符串更新时随时更新,但只有在存在某种类型的通知时才会发生这种情况。
例如,您的表单可以实施INotifyPropertyChanged,而您的Label
属性可以在通知发生变更时发出通知。
public partial class CourierDeliveringEnemyReport : Form, INotifyPropertyChanged
然后它可以以类似于
的方式实现private string _label1;
public string Label1
{
get { return _label1; }
set
{
if(_label1 == value) return;
_label1 = value;
OnPropertyChanged("Label1");
}
}
//implement the INotifyPropertyChanged interface
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
由于这是WinForms,因此没有XAML标记来添加绑定,因此您可以使用Binding在后面的代码中执行此操作。
public CourierDeliveringEnemyReport()
{
InitializeComponent();
//"Text" is the property on the control to get/set (i.e. Label1.Text)
//this is the datasource
//"Label1" is the property in our code
label1.DataBindings.Add(new Binding("Text", this, "Label1"))
//add bindings for other labels
}
(代码未经测试但应该提出想法)
答案 1 :(得分:1)
为什么不简单地创建获取和设置这些标签文本的公共属性?
当属性是表单的成员并且您只想将它们用于更新这些标签时,使用数据绑定和INotifyPropertyChanged
是没有意义的,而且工作量太大。足以在表单中创建一些公共属性,为标签赋值:
public string Value1
{
get { return this.label1.Text; }
set { this.label1.Text = value; }
}
int value2;
public int Value2
{
get { return value2; }
set
{
value2 = value;
this.label2.Text = string.Format("Here is the value {0}", value);
}
}
然后它足以设置这些属性以查看这些标签的文本。
var f = new ReportForm() {Value1 = "text for label1", Value2 = 100};
f.Show();
答案 2 :(得分:0)
查看代码,您将在构造函数中分配Labelx属性之前初始化它们。此时它们将返回null,因此标签没有内容。
在对Labelx属性进行任何更新后,您可能需要另一种方法来更新标签。
ld
答案 3 :(得分:0)
您正在运行构造函数:
CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport();
指定标签控件未分配标签#属性。
要么像PaulF建议的那样,之后通过更新标签控件,或者将Label#属性的字符串值传递给构造函数,分配它们,然后执行:label1.Text = Label1;
伪示例:
public CourierDeliveringEnemyReport(string l1, string l2, string l3, string l4, string l5, string l6)
{
InitializeComponent();
Label1 = l1;
Label2 = l2;
/* and so on */
label1.Text = Label1;
label2.Text = Label2;
label3.Text = Label3;
label4.Text = Label4;
label5.Text = Label5;
label6.Text = "This is a test!";
}
答案 4 :(得分:0)
你必须实现INotifyPropertyChanged
public partial class CourierDeliveringEnemyReport : Form, INotifyPropertyChanged
{
public static string Label1
{
get
{
return Label1;
}
set
{
Label1=value;
OnPropertyChanged("Label1");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
public CourierDeliveringEnemyReport()
{
InitializeComponent();
label1.Text = Label1;
label1.DataBindings.Add(new Binding("Text", this, "Label1"));
}
}
现在,当您更改Label1的值时,它将自动更新为实际标签绑定到它。
CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport();
CourierDeliveringEnemyReport.Label1 = "Report from " + BlueArmy[GameEventList[i].ObservingUnit].Name; ;