将字符串传递给标签的正确方法是什么?

时间:2016-07-19 16:11:10

标签: c# string winforms

我有一个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(测试用例)之外的字符串值。

我做错了什么?

谢谢!

5 个答案:

答案 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; ;