using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using UtilityLibrary.WinControls;
using WeifenLuo.WinFormsUI.Docking;
using System.Threading;namespace LightCtrlApp
{
    public partial class StateForm :DockContent
    {
        public StateForm()
        {
            InitializeComponent();
        }        public void SetLabelText(string[] infoArr)
        {
            this.label1.Text = infoArr[0];
            this.label3.Text = infoArr[1];
            this.label5.Text = infoArr[2];
            this.label7.Text = infoArr[3];
        }
    }
}
label1_7的值都没有改变,其中infoArr调试过
(infoArr是另一个类传递过来的值,是通过委托和事件从另一个类传递给StateForm类下的这个方法SetLableText()),infoArr里面有值而且值是正确的,调试也有进到这个函数我就是不知道为什么label的值没有改变?

解决方案 »

  1.   

    label需要刷新
    label1.refresh();
      

  2.   

    我初步的怀疑,你的infoArr[i]里面含有换行之类的。
    把label的size先弄的很大 看看。。
      

  3.   

    这是另一个类下面的代码:        public delegate void MyHandler(string[] param);       //声明委托
             public event MyHandler MyEvent;        private void QueryAccurate_Load(object sender, EventArgs e)
            {
                InitcmbArea();
                initRoomDataView();            StateForm stateForm = new StateForm();
                this.MyEvent += stateForm.SetLabelText;//注册方法
            }        private void cmbArea_SelectedIndexChanged(object sender, EventArgs e)
            {
                ...................
                string[] infoArr = new string[4];
                infoArr[0] = AreaName;
                infoArr[1] = CalculateLight.ToString();
                infoArr[2] = LightOpenNum.ToString();
                infoArr[3] = LightCloseNum.ToString();            if (MyEvent != null)
                {
                    //如果有对象注册
                      MyEvent(infoArr);
                }
                                       
            }
      

  4.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using UtilityLibrary.WinControls;
    using WeifenLuo.WinFormsUI.Docking;
    using System.Threading;namespace LightCtrlApp
    {
        public partial class StateForm :DockContent
        {
            public StateForm()
            {
                InitializeComponent();
            }        public void SetLabelText(string[] infoArr)
            {
                this.label1.Text = infoArr[0];
                this.label3.Text = infoArr[1];
                this.label5.Text = infoArr[2];
                this.label7.Text = infoArr[3];
            }
        }
    }
    高手赶紧帮我看看!
      

  5.   


            private void QueryAccurate_Load(object sender, EventArgs e)
            {
                InitcmbArea();
                initRoomDataView();            StateForm stateForm = new StateForm();
                this.MyEvent += stateForm.SetLabelText;//注册方法
            }
    你把事件注册在了stateform的一个新实例上了。
    你原来的窗体当然不会发生变化。
      

  6.   

    stateForm就是class StateForm 下的这个方法SetLabelText(string[] infoArr)
    这样不行???
      

  7.   


    当然不行了。
            private void QueryAccurate_Load(object sender, EventArgs e)
            {
                InitcmbArea();
                initRoomDataView();            StateForm stateForm = new StateForm();
                this.MyEvent += stateForm.SetLabelText;//注册方法
            }
    创建了一个新的StateForm实例,并且在新实例上注册了时间。
    只是StateForm没有显示出来而已。
            private void QueryAccurate_Load(object sender, EventArgs e)
            {
                InitcmbArea();
                initRoomDataView();            StateForm stateForm = new StateForm();
                this.MyEvent += stateForm.SetLabelText;//注册方法
                stateForm.Show();//添加该行,试一下效果你就知道了。
            }
      

  8.   

    1.是两个窗体传值:一个是QueryAccurate窗体,另一个是stateForm窗体2.我之所以要注册在stateform的一个新实例上了。就是想将QueryAccurate窗体的值传递给stateform这个类下的SetLabelText()这个方法,它确实收到,并且处理了,可是label没有更新啊!
      

  9.   

    这样又遇到问题了,那我每次传值就要跳出一个窗体,每次都要NEW一个!
    其实stateForm这个窗体在程序一开始时就已经加载了。
    我就是不想让它重新NEW然后重新SHOW
    只想窗体创建一次!
      

  10.   


    private void QueryAccurate_Load(object sender, EventArgs e)
    {
    InitcmbArea();
    initRoomDataView();StateForm stateForm = new StateForm();
    this.MyEvent += stateForm.SetLabelText;//注册方法
    stateForm.Show();//添加该行,试一下效果你就知道了。
    }加上显示的代码。看看你是两个窗体:一个是QueryAccurate窗体,另一个是stateForm窗体
    还是三个窗体:一个是QueryAccurate窗体,另两个是stateForm窗体
      

  11.   

    不知道你这两个窗体的启动顺序,
    反正解决办法就是,想办法把stateForm的引用传递给QueryAccurate
    然后在
    private void QueryAccurate_Load(object sender, EventArgs e)
    {
    InitcmbArea();
    initRoomDataView();//StateForm stateForm = new StateForm();
    this.MyEvent += stateForm.SetLabelText;//注册方法
    //stateForm.Show();//添加该行,试一下效果你就知道了。
    }
    此时的stateForm为传递的引用。
      

  12.   

    如果是这样的话我干嘛绕那么打圈子用委托和事件,直接用简单的方法就可以传值了,就是别人说用这种方法可以实时传值,故用了此方法,可是用了这种方法每次不还是要NEW一次SHOW一次!
      

  13.   

    总结一下:
    我又在第一段代码的基础上加了如下代码
    前提是StateForm必须在QueryAccurate窗体创建之前创建
    这样才能传递StateForm指针给QueryAccurate窗体
    这样就实现了
            StateForm stateForm = new StateForm();
            public QueryAccurate(StateForm tmpForm)
            {
                InitializeComponent();
                stateForm = tmpForm;
            }        public delegate void MyHandler(string[] param);       //声明委托
             public event MyHandler MyEvent;        private void QueryAccurate_Load(object sender, EventArgs e)
            {
                InitcmbArea();
                initRoomDataView();            this.MyEvent += stateForm.SetLabelText;//注册方法
            }        private void cmbArea_SelectedIndexChanged(object sender, EventArgs e)
            {
                ...................
                string[] infoArr = new string[4];
                infoArr[0] = AreaName;
                infoArr[1] = CalculateLight.ToString();
                infoArr[2] = LightOpenNum.ToString();
                infoArr[3] = LightCloseNum.ToString();            if (MyEvent != null)
                {
                    //如果有对象注册
                      MyEvent(infoArr);
                }
                                       
            }