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的关闭无效?
如果你有好的方法,请告诉我写在什么位置,或者大体在什么位置,菜鸟一个,你不说,我不知道写在哪,谢谢。

解决方案 »

  1.   

    private void MainForm_Load(object sender, EventArgs e)
            {
                try
                {
                    LoginForm dl = new LoginForm();
                    DialogResult result = dl.ShowDialog();
                    if (result == DialogResult.OK)
                    {
                       //do something
    if (user == null)
    this.close();
                    }
    else
    {
    this.close();
    }
      

  2.   

    抱歉楼上,我说为什么没有人来回帖子,原来是没分的缘故,新手,以前没混过这里,所以不知道,原来注册就有400分,等结贴我会给你20作为热心帮助的感谢,等过了24小时,我再给帖子加分,
    楼上,user是什么意思?
    还有,如果我对LgoinForm进行close操作,结果,MainForm就不会显示,好像也被一同销毁了
      

  3.   

    呵呵,楼主诚心请教,就算0分贴.也会有不少人乐意帮助的.加多一个else试试:
    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();
    }
      

  4.   

    this指的是当前类的实例,你的当前类是在mainform里面,this.close当然是对mainform关闭了
    要关loginform的话,用他的实例调用dl.close();
    还有,你的思路很乱,不太明白你说什么
    看看loginform的closing事件作了些什么,如果是vs2005就是formclosing事件,估计里面有错,你看看哪个有未将对象设置到引用的错误吧。
      

  5.   

    修改Main方法:LoginForm dl = new LoginForm();
    DialogResult result = dl.ShowDialog();
    if (result == DialogResult.OK)
    {
        Application.Run(new   MainForm()),if (user == null)
    }把MainForm_Load事件去掉。
      

  6.   

    多谢6楼,我加了和你一样的,问题如一,Object   reference   not   set   to   an   instance   of   ,出现两次,然后MainForm一样出现,并没有关闭
    多谢7楼,可能是我没说清楚,我在MainForm中调用了LoginForm,如果我关闭了LoginForm,如何将2个同时关闭?这样,是不是就问题明确了?问题是,Closing在哪里改?总不能我去修改基类的吧?
    多谢8楼,我用的是vs2005,Application.Run是在单独的Program.cs中调用的,像你这么改,我好像问题就更多了,而且我在MainForm_Load事件中,定义了很多其它的操作,去掉就没发用了。重赏之下,果然效率就不一样了。等
      

  7.   

    为求答案,附上两个文件的代码:
    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);
                }
            }.................略去了
    有新的答案么?
      

  8.   

    问题出在这几句:
    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;