首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# WinForm DataGridView显示数据有关问题

2013-10-09 
C#WinFormDataGridView显示数据问题以前的程序是将登陆窗体作为应用程序中Run()的,然后使用线程池将主窗体

C# WinForm DataGridView显示数据问题
以前的程序是将登陆窗体作为应用程序中Run()的,然后使用线程池将主窗体显示出来,DataGridView上的数据也是有服务器返回并在客户端显示的,都没有问题。今天把程序改了下,把主窗体改为Run()的窗体,但是遇到了问题,客户端能收到服务器发来的数据,但是就是不能显示在DataGridView上,大家帮忙看看原因。
以前的程序代码:

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new 登陆());
        }

        private void handleMsg(string commandStr)
        {
            switch (commandStr)
            {
                case "LoginSuccess":         
                    {                 
                        buff = new byte[data.Length - leng];
                        for (int j = 0; j < data.Length - leng; j++)
                            buff[j] = data[leng + j];
                        memStream = new MemoryStream(buff);
                        memStream.Seek(0, SeekOrigin.Begin);
                        obj = formatter.Deserialize(memStream);
                        memStream.Close();
                        if (obj != null && obj is User)
                            user = (User)obj;
                        frm = new 申请及扫描(user, this);
                        登陆.LoginFormDelegate closeDelegate = new 登陆.LoginFormDelegate(loginForm.loginFormAction);  //申明委托
                        loginForm.Invoke(closeDelegate, new String[] { "close" }); //调用委托
                        ThreadPool.QueueUserWorkItem(new WaitCallback(showAppScanfDialog), frm);
                        }
                    break;
                #endregion
  #region    获取服务器发来的自己已申请的作业
                case "ReFreshApp":      //获取服务器发来的自己已申请的作业
                    ///取出数据
                    buff = new byte[data.Length - leng];
                    for (int j = 0; j < data.Length - leng; j++)
                        buff[j] = data[leng + j];
                    申请及扫描.AppScanfDelegate appScanfDelegate = new 申请及扫描.AppScanfDelegate(frm.AppScanfFromAppAction);
                    frm.Invoke(appScanfDelegate, new Object[] { buff });


                    break;
                #endregion
       }
}



 #region  给dagvApp绑定数据表
        public void AppScanfFromAppAction(byte[] buffer)  
        {
            DataTable dt = new DataTable();
            memStream = new MemoryStream(buffer);
            memStream.Seek(0, SeekOrigin.Begin);
            dt = (DataTable)formatter.Deserialize(memStream);
            memStream.Close();
            dagvApp.DataSource = dt;
            dagvApp.AllowUserToAddRows = false;    //不显示datagridview中的空白行
        }
        #endregion


现在的代码:
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            登陆 loginForm = new 登陆();
            if (loginForm.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new 申请及扫描());
            }
        }

private void handleMsg(string commandStr)
        {
            switch (commandStr)
            {
                #region    登陆成功
                case "LoginSuccess":         
                    {
                        loginForm.DialogResult = DialogResult.OK;
                        buff = new byte[data.Length - leng];
                        for (int j = 0; j < data.Length - leng; j++)
                            buff[j] = data[leng + j];
                        memStream = new MemoryStream(buff);
                        memStream.Seek(0, SeekOrigin.Begin);
                        obj = formatter.Deserialize(memStream);
                        memStream.Close();
                        if (obj != null && obj is User)
                            user = (User)obj;
           }
                    break;
                #endregion
  #region    获取服务器发来的客户已申请的作业
                case "ReFreshApp":     
                    ///取出数据
                    buff = new byte[data.Length-leng];


                    for (int j = 0; j < data.Length-leng; j++)
                        buff[j] = data[leng + j];
                    frm.AppScanfFromAppAction(buff);
                    
                    //申请及扫描.AppScanfDelegate appScanfDelegate = new 申请及扫描.AppScanfDelegate(frm.AppScanfFromAppAction);
                    //frm.Invoke(appScanfDelegate, new Object[] { buff });
                    break;
                #endregion
          }
 }


  #region  给dagvApp绑定数据表
        public void AppScanfFromAppAction(byte[] buffer)  
        {
            DataTable dt = new DataTable();
            memStream = new MemoryStream(buffer);
            memStream.Seek(0, SeekOrigin.Begin);
            dt = (DataTable)formatter.Deserialize(memStream);
            memStream.Close();
            dagvApp.DataSource = dt;
            dagvApp.AllowUserToAddRows = false;    //不显示datagridview中的空白行
        }
        #endregion


[解决办法]
 dagvApp.DataSource = dt;
dagvApp.AllowUserToAddRows = false;    //不显示datagridview中的空白行


你dgv对应的字段绑定对了没有?
[解决办法]
如果你的handleMsg方法,是在一个单独的线程中(比如Timer)调用的,那么直接调用方法是不行的,因为你绑定数据源的时候,会造成DataGridView刷新,而控件刷新应该是发生在UI线程中,这属于跨线程操作UI界面,所以必须利用Invoke。
[解决办法]
frm是在哪赋值的,不会是一个新对象吧

 #region    获取服务器发来的客户已申请的作业
                case "ReFreshApp":     
                    ///取出数据
                    buff = new byte[data.Length-leng];
                    for (int j = 0; j < data.Length-leng; j++)
                        buff[j] = data[leng + j];
                    frm.AppScanfFromAppAction(buff);
                     
                    //申请及扫描.AppScanfDelegate appScanfDelegate = new 申请及扫描.AppScanfDelegate(frm.AppScanfFromAppAction);
                    //frm.Invoke(appScanfDelegate, new Object[] { buff });
                    break;
                #endregion
[解决办法]
很明显是2个form对象,如果想访问同一对象,可以用单例模式

热点排行