初学者,原先一直搞的是Asp.net,现在要临时弄个winform程序。在first窗体内有以下代码:
frmMain fmain = new frmMain();
fmain.Show();
frmLogin Login = new frmLogin(fmain);
Login.ShowDialog();
this.Hide();public partial class frmLogin : Form
{
    Form frm;
    public frmLogin()
    {
        InitializeComponent();
    }    public frmLogin(Form f):this()
    {
        frm = f;
    }     private void btnLogin_Click(object sender, EventArgs e) //登录
    {
        ......
 1      string frmTitle = frm.Text;  //本句可以得到fmain窗体标题栏的文本
 2      frm.setUserRights();  //调用fmain窗体中的一个函数  <- 出错
 3      frm.tsslUser.Text = "||当前操作用户: " + M_str_name;   //改写fmain窗体状态行的文本内容  <- 出错
 4      frm.frmMain_Load(sender, e)   //调用fmain窗体的Load()事件  <- 出错
    }
}在登录click事件代码中,第1句可以获得fmain窗体的标题栏内容,说明通过传参确实把fmain窗体对象传入了,但后三句均报错,说是不存在,可fmain窗体中明明都有啊。请高手指点一二,谢谢!

解决方案 »

  1.   

    frmMain fmain = new frmMain(); 
    fmain.Show(); 
    frmLogin Login = new frmLogin(fmain); 
    Login.ShowDialog(); 
    this.Hide(); public partial class frmLogin : Form 

        frmMain  frm; 
        public frmLogin() 
        { 
            InitializeComponent(); 
        }     public frmLogin(Form f):this() 
        { 
            frm = f; 
        }     private void btnLogin_Click(object sender, EventArgs e) //登录 
        { 
            ...... 
    1      string frmTitle = frm.Text;  //本句可以得到fmain窗体标题栏的文本 
    2      frm.setUserRights();  //调用fmain窗体中的一个函数  <- 出错 
    3      frm.tsslUser.Text = "||当前操作用户: " + M_str_name;  //改写fmain窗体状态行的文本内容  <- 出错 
    4      frm.frmMain_Load(sender, e)  //调用fmain窗体的Load()事件  <- 出错 
        } 
      

  2.   

    frmMain fmain = new frmMain(); 
    fmain.Owner=this; //申明为子窗体
    fmain.Show(); 
    我试了,属性,方法都可以调用
    如果是里面的控件,将访问改为Public就行了
      

  3.   

    可以的... 但你必须获得你要调用窗体的实例就可以.
    1 作为参数传递
    2 你可以通过Application.OpenForms获取
    3 静态变量保存窗体.
      

  4.   

     嗯. 设为public!! 就可以调用了
      

  5.   


    这是访问修饰符的访问限制作用
    在C#中,属性是public的
    类默认是internal的,在当前程序集中可访问
    类的成员,包括方法和字段,默认是private的窗体标题栏的文本是“属性”,所以可以访问
    窗体的Load事件以及其他的字段、控件等,默认都是private的
     private void Form1_Load(object sender, EventArgs e)解决办法:
    (1)需要在其他类中访问的方法、字段或控件声明是public (简单,但不太推荐)
    (2)通过委托、事件来调用其他窗体的方法,改变状态选择文本内容的代码也放在方法里
       调用事件就是传消息过去 (推荐)
      

  6.   

    Form frm; 改成frmLogin frm;
      

  7.   

    private void btnLogin_Click(object sender, EventArgs e) //登录 
    改成 
    public void btnLogin_Click(object sender, EventArgs e) //登录 
      

  8.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form1 frm = new Form1(toolStripStatusLabel1);
                frm.Show();
            }
        }
    }using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            ToolStripStatusLabel ts;
            public Form1()
            {
                InitializeComponent();
            }
            public Form1(ToolStripStatusLabel t)
                : this()
            {
                ts = t;           
            }        private void button1_Click(object sender, EventArgs e)
            {
                ts.Text = "ddd";
            }
            
        }
    }窗体Form2上有textBox1文本控件和button1按钮控件、statusStrip1状态栏窗体Form2上有一个button1按钮控件,点击button1控件即可修改状态栏的值
      

  9.   

    修改窗体Form2上有一个button1按钮控件,点击button1控件即可修改状态栏的值
    为窗体Form1上有一个button1按钮控件,点击button1控件即可修改状态栏的值
    并且点击Form2的button1控件弹出Form1窗体
      

  10.   

    private void CreateForm(string strName)
    {
    this.Cursor = Cursors.WaitCursor;string path=AssemblyName;
    string name=strName; Form fm=(Form)Assembly.Load(path).CreateInstance(name);
    fm.MdiParent=this.ParentForm;
    fm.Show();
    fm.Dock=DockStyle.Fill;
    this.Cursor = Cursors.Default;

    反射调用或多线程
    参考
    参考
      

  11.   

    改一下作用域
    一般默认为PRIVATE,改成PUBLIC就可以访问
      

  12.   

    跟跨线程访问窗体的原理类似的,但这里,你可以在每个窗体类里定义一个当前窗体的静态对象,然后,其他窗体就可以调用该窗体的所有public对象了。
    form1:Form()
    {
    public form1()
    {
      ..................
      form1=this;}
      static public form1=null;
       ...............
    }
    form2:Form()
    {
    .....................
    ....................
    }
      

  13.   

    建议楼主换个思路用 WinForm 时最先出现的是登录对话框,只有登录成功之后才显示主窗体,否则如果用户选择取消则主窗体根本都不用创建。所以我觉得应该在 Main 方法内做这样的操作:[STAThread]
    static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    // FrmLogon 是登录窗体
    FrmLogon frm = new FrmLogon();

    DialogResult dr = frm.ShowDialog();
    if(dr == DialogResult.Cancel)
        return;

    // 一个全局类,用于保存全进程中需要访问的全局数据
    WinFormGlobal.LogonUser = frm.LogonUser;

    Application.Run(new FrmMain()); // FrmMain 是主窗体
    }其中 FrmLogon 是一个登录窗体,当登录成功后,可在代码中加入
    this.DialogResult = DialogResult.OK在点击“取消”按钮事件中加入:
    this.DialogResult = DialogResult.Cancel;
    this.Close();从设计模式的角度看,登录窗体的功能应该是相对独立的,不应该掺和主窗体的事
      

  14.   

    最简单的方式  设置为public