初学者,原先一直搞的是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窗体中明明都有啊。请高手指点一二,谢谢!
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窗体中明明都有啊。请高手指点一二,谢谢!
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()事件 <- 出错
}
}
fmain.Owner=this; //申明为子窗体
fmain.Show();
我试了,属性,方法都可以调用
如果是里面的控件,将访问改为Public就行了
1 作为参数传递
2 你可以通过Application.OpenForms获取
3 静态变量保存窗体.
这是访问修饰符的访问限制作用
在C#中,属性是public的
类默认是internal的,在当前程序集中可访问
类的成员,包括方法和字段,默认是private的窗体标题栏的文本是“属性”,所以可以访问
窗体的Load事件以及其他的字段、控件等,默认都是private的
private void Form1_Load(object sender, EventArgs e)解决办法:
(1)需要在其他类中访问的方法、字段或控件声明是public (简单,但不太推荐)
(2)通过委托、事件来调用其他窗体的方法,改变状态选择文本内容的代码也放在方法里
调用事件就是传消息过去 (推荐)
改成
public void btnLogin_Click(object sender, EventArgs e) //登录
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控件即可修改状态栏的值
为窗体Form1上有一个button1按钮控件,点击button1控件即可修改状态栏的值
并且点击Form2的button1控件弹出Form1窗体
{
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;
}
反射调用或多线程
参考
参考
一般默认为PRIVATE,改成PUBLIC就可以访问
form1:Form()
{
public form1()
{
..................
form1=this;}
static public form1=null;
...............
}
form2:Form()
{
.....................
....................
}
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();从设计模式的角度看,登录窗体的功能应该是相对独立的,不应该掺和主窗体的事