在Form1窗体中代码如下
        private void BtLogin_Click(object sender, EventArgs e)
        {
            string loginid = txtLoginID.Text.Trim();
            if (true)
            {
                this.DialogResult = DialogResult.OK;
                UserLoginID LogID = new UserLoginID(main.LoginLog);
                LogID(loginid);
            }
            
        }
在Form2窗体的代码如下:
        delegate void UserLoginID(string LoginID);
        public void LoginLog(string Log)
        {
            label1.Text = Log;
        }在Program中代码是这样的:
            Form1 frm1 = new Fomr1();
            if (frm1 .ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainMDI());
            }我加断点运行的时候看见能传过去值,但是后边部知道什么地方,就会把这个值给刷新掉,就没有了,还是没有传值过去!!!帮帮我啊!!

解决方案 »

  1.   

     LogID(loginid);
    看不懂了
      

  2.   

    不知道从什么时候起,窗体间传值就和委托有了关系。其实根本用不到。Form2写一个构造函数:
    public Form2(string Log)
    {
        InitializeComponent();
        label1.Text = Log;
    }Form1调用:Form2 frm2 = new Form2(this.txtLoginID.Text..Trim());
    frm2.Show();
    Form1调用:
      

  3.   

    UserLoginID LogID = new UserLoginID(main.LoginLog);
    这里的main是form2?
    贴出完整一点的代码。
      

  4.   

    运行后是这样吧?
    label1.Text = Log = loginid =  txtLoginID.Text.Trim();
      

  5.   

    假设我们需要点击主窗体FMMain中的某一个按钮时打开子窗体FMChild并将某一个值传给子窗体FMChild,一般情况下,我们点击按钮显示子窗体FMChild的代码为:FMChild fmChild = new FMChild();fmChild.ShowDialog();fmChild.Dispose();  
    如果我们需要将主窗体FMMain中的string strValueA的值传给FMChild,那么我们首先对strValueA进行如下处理:private string strValueA;public string StrValueA  {    get { return strValueA; }    set { strValueA = value; }  }  
    使其成为主窗体FMMain的一个属性,接着修改显示子窗体的代码为以下两种的其中一种。方法一:FMChild fmChild = new FMChild();fmChild.ShowDialog(this);fmChild.Dispose();  
    方法二:FMChild fmChild = new FMChild();FMChild.Owner = this;fmChild.ShowDialog();fmChild.Dispose();  
    然后在修改子窗体FMChild中申明一个主窗体FMMain对象,FMMain fmMain;  
    在需要使用主窗体FMMain的string strValueA的地方加上如下代码:fmMain = (FMMain)this.Owner;  
    这样,就可以获得主窗体FMMain中strValueA的值了。
      

  6.   

    ……………… 你这个委托有啥意义呢??  UserLoginID LogID = new UserLoginID(main.LoginLog);
      LogID(loginid);跟 main.LoginLog(loginid); 没有任何区别……你的名为main的Form2实例是在什么时候创建的?
      

  7.   

     UserLoginID LogID = new UserLoginID(main.LoginLog);
    main.LoginLog是你Form2里的方法,你在From1里可见吗?
      

  8.   

    虽然我给出了方法。但是我还想指出。随意改变别的窗体的值,不是一个好的做法。或者说是很糟糕的设计。LZ可以借鉴OpenFileDialog这些系统标准对话框的设计思想。
      

  9.   

    hehe.cs
    public static string haha="";
    haha=txtLoginID.Text.Trim();
    label1.text=hehe.haha;
      

  10.   

    Form1
    public partial class UserLogin : Form
        {
            MainMDI main = new MainMDI();
            public UserLogin()
            {
                InitializeComponent();
                this.AcceptButton = this.btnOK;
                this.CancelButton = this.btnCancel;
            }        private void BtLogin_Click(object sender, EventArgs e)
            {
                string loginid = txtLoginID.Text.Trim();
                string loginpwd = txtPwd.Text.Trim();
                if (true)
                {
                    this.DialogResult = DialogResult.OK;
                    UserLoginID LogID = new UserLoginID(main.LoginLog);
                    LogID(loginid);
                }
                else
                {
                    MessageBox.Show("用户名密码错误,请返回检查!", "错误提示");
                }
                
            }
    Form2delegate void UserLoginID(string LoginID);
        public partial class MainMDI : Form
        {
            public MainMDI()
            {
                InitializeComponent();
            }        public void LoginLog(string Log)
            {
                label1.Text = Log;
            }很乱,不好意思贴出来!!
      

  11.   

            在Form1窗体中代码如下
                在Form1里添加事件定义:
                public event UserLoginID showId;
                    然后:BtLogin_Click事件里
                        将 UserLoginID LogID = new UserLoginID(main.LoginLog);
                       LogID(loginid);
            这两句去掉改成:
             if (showId != null)
                        showId(loginid);        在Form2里面:Form1 frm1 = new Fomr1();
            构造函数里加:frm1.showId+=new ShowMessageEventHandler(LoginLog);
            Form2的LoginLog方法体修改为:
        { 
            UserLoginID showDel = delegate(string msgToshow)
                {
                   label1.Text = msgToshow;
                };
        }
        
        在Program中 直接加载Form2就OK了
      

  12.   

    MainMDI main = new MainMDI();
    我感觉是这个问题,你的MainMDI定义在类内了,而没有传递
      

  13.   

    我的意思是没有传递到你真正要显示的MainMDI上面。。而是Form1里面的MainMDI了。
      

  14.   

    LZ你的效果 确实有了(虽然委托有点不必要)只是你调用LogID 修改的是UserLogin里面的MainMDI的label1, 而你的UserLogin消失以后 显示的确实一个新的MainMDI : Application.Run(new MainMDI());
      

  15.   


    frm1.showId+=new ShowMessageEventHandler(LoginLog);
    的ShowMessageEventHandler报错了,不知道什么原因,请帮忙
      

  16.   

    这样改:
    //Program.cs
    MainMDI mainMDI = new MainMDI()
      Form1 frm1 = new Fomr1(mainMDI);
      if (frm1 .ShowDialog() == DialogResult.OK)
      {
      Application.Run(mainMDI);
      }
    // From1.cs
    public partial class UserLogin : Form
        {// 这一行去掉。
    //        MainMDI main = new MainMDI();
    // 添加参数传递
            public UserLogin(MainMDI amain)
            {
    // 设定参数。
    this.main = amain;
                InitializeComponent();
                this.AcceptButton = this.btnOK;
                this.CancelButton = this.btnCancel;
            }        private void BtLogin_Click(object sender, EventArgs e)
            {
                string loginid = txtLoginID.Text.Trim();
                string loginpwd = txtPwd.Text.Trim();
                if (true)
                {
                    this.DialogResult = DialogResult.OK;
                    UserLoginID LogID = new UserLoginID(main.LoginLog);
                    LogID(loginid);
                }
                else
                {
                    MessageBox.Show("用户名密码错误,请返回检查!", "错误提示");
                }
                
            }