c#建立了两个窗体,MainForm和LoginForm,在Program.cs中,Application.Run(new MainForm()),然后在
private void MainForm_Load(object sender, EventArgs e)
{
try
{
LoginForm dl = new LoginForm();
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
//do something
}我使用了DevComponents的控件,两个窗体分别
partial class LoginForm :DevComponents.DotNetBar.Office2007Form
public partial class MainForm : DevComponents.DotNetBar.Office2007Form问题:程序启动,首先显示的是LoginForm,当我点击右上角的关闭按钮时,出现Object reference not set to an instance of object(请不要回帖告诉我这句话的中文意思,这对我没有帮助,请告诉有这句话我应该怎么改),这句话出现2次,LoginForm关闭了,同时,MainForm显示出来了,我的目的是点LoginForm右上角的关闭时,MainForm不再显示,即两个都关闭,为什么LoginForm的关闭无效?
如果你有好的方法,请告诉我写在什么位置,或者大体在什么位置,菜鸟一个,你不说,我不知道写在哪,谢谢。
private void MainForm_Load(object sender, EventArgs e)
{
try
{
LoginForm dl = new LoginForm();
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
//do something
}我使用了DevComponents的控件,两个窗体分别
partial class LoginForm :DevComponents.DotNetBar.Office2007Form
public partial class MainForm : DevComponents.DotNetBar.Office2007Form问题:程序启动,首先显示的是LoginForm,当我点击右上角的关闭按钮时,出现Object reference not set to an instance of object(请不要回帖告诉我这句话的中文意思,这对我没有帮助,请告诉有这句话我应该怎么改),这句话出现2次,LoginForm关闭了,同时,MainForm显示出来了,我的目的是点LoginForm右上角的关闭时,MainForm不再显示,即两个都关闭,为什么LoginForm的关闭无效?
如果你有好的方法,请告诉我写在什么位置,或者大体在什么位置,菜鸟一个,你不说,我不知道写在哪,谢谢。
{
try
{
LoginForm dl = new LoginForm();
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
//do something
if (user == null)
this.close();
}
else
{
this.close();
}
楼上,user是什么意思?
还有,如果我对LgoinForm进行close操作,结果,MainForm就不会显示,好像也被一同销毁了
private void MainForm_Load(object sender, EventArgs e)
{
try
{
LoginForm dl = new LoginForm();
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
//do something
}
else
{
this.close();
}
要关loginform的话,用他的实例调用dl.close();
还有,你的思路很乱,不太明白你说什么
看看loginform的closing事件作了些什么,如果是vs2005就是formclosing事件,估计里面有错,你看看哪个有未将对象设置到引用的错误吧。
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
Application.Run(new MainForm()),if (user == null)
}把MainForm_Load事件去掉。
多谢7楼,可能是我没说清楚,我在MainForm中调用了LoginForm,如果我关闭了LoginForm,如何将2个同时关闭?这样,是不是就问题明确了?问题是,Closing在哪里改?总不能我去修改基类的吧?
多谢8楼,我用的是vs2005,Application.Run是在单独的Program.cs中调用的,像你这么改,我好像问题就更多了,而且我在MainForm_Load事件中,定义了很多其它的操作,去掉就没发用了。重赏之下,果然效率就不一样了。等
LoginForm.cs
namespace OOO
{
public partial class LoginForm
{
// tcpClient是Login的一个公共属性,它用于创建客户端套接字,也用于向MainForm的tcpClient传送
public TcpClient tcpClient;
// Alias是Login的一个公共属性,它向ChatClient窗体传送用户名
public string Alias = ""; private bool SetupButtonState = true; public LoginForm()
{
InitializeComponent();
} private void btnLogin_Click(object sender, EventArgs e)
{
uincomboBox.Text = uincomboBox.Text.Trim();
if (uincomboBox.Text.Length == 0)
{
MessageBox.Show("请输入您的昵称!", "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
uincomboBox.Focus();
return;
}
try
{
// 创建一个客户端套接字,它是Login的一个公共属性,将被传递给
// MainForm窗体
tcpClient = new TcpClient();
// 向指定的IP地址的服务器发出连接请求
IPAddress ipAdd1 = IPAddress.Parse(txtIpAdd.Text);
int port = Int32.Parse(txtIpPort.Text);
tcpClient.Connect(ipAdd1, port);
Alias = uincomboBox.Text; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
MainForm.cs
namespace OOO
{
public partial class MainForm : DevComponents.DotNetBar.Office2007Form
{
// 与服务器的连接
private TcpClient tcpclient;
// 与服务器数据交互的流通道
private NetworkStream Strm;
// 用户名
private string UserAlias;
// 布尔变量用于判断是否为“私聊”
private bool privatemode = false; public MainForm()
{
InitializeComponent();
} private void MainForm_Load(object sender, EventArgs e)
{
try
{
LoginForm dl = new LoginForm();
DialogResult result = dl.ShowDialog();
if (result == DialogResult.OK)
{
//当Login窗口登入成功后,其Alias属性中存放着用户名,将其值赋给UserAlias属性
// 注意dlgLogin.Alias是从LoginForm窗口中传送过来的登录用户名
UserAlias = dl.Alias;
//当Login窗口登入成功后,其tcpClient属性中存放着与服务器的连接,将其值赋给
//tcpclient属性
tcpclient = dl.tcpClient;
//获得与服务器数据交互的流通道(NetworkStream)
Strm = tcpclient.GetStream();
}
else
{
dl.Close();
}
//启动一个新的线程,执行方法this.ServerResponse(),以便来响应从服务器发回的信息
Thread thread = new Thread(new ThreadStart(this.ServerResponse));
thread.Start();
//向服务器发送“CONN”请求命令,此命令的格式与服务器端的定义的格式一致,
//命令格式为:命令标志符(CONN)|发送者的用户名|
string cmd = "CONN|" + UserAlias + "|";
//将字符串转化为字符数组
Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(cmd.ToCharArray());
Strm.Write(outbytes, 0, outbytes.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}.................略去了
有新的答案么?
UserAlias = dl.Alias;
tcpclient = dl.tcpClient;
dl.Close();楼主你的loginForm既然关闭后,便会释放资源,若再读它,便会出错.你可以定义一个全局的静态量,保存登录信息:
if (result == DialogResult.OK)
{
UserAlias = LoginClass.Alias;
tcpclient = LoginClass.tcpClient;
}
else
{
this.close();
}
另外:
MainForm里用:if (result == DialogResult.OK)之前,需要在LoginFrom设置DialogResult返回值,不然你每次关闭返回:Cancel,楼主你得在LoginForm的btnLogin_Click事件后面设置对话框返回值:
this.DialogResult = DialogResult.OK;