C# WinForm DataGridView显示数据问题

w_angfei 2013-09-30 04:43:24
以前的程序是将登陆窗体作为应用程序中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

...全文
871 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34483943 2016-03-30
  • 打赏
  • 举报
回复
数据源没有指定表
feiyun0112 2013-10-08
  • 打赏
  • 举报
回复
Application.Run(申请及扫描.Singleton); 申请及扫描.AppScanfDelegate appScanfDelegate = new 申请及扫描.AppScanfDelegate(申请及扫描.Singleton.AppScanfFromAppAction); 申请及扫描.Singleton.Invoke(appScanfDelegate, new Object[] { buff });
w_angfei 2013-10-08
  • 打赏
  • 举报
回复
引用 13 楼 feiyun0112 的回复:
很明显是2个form对象,如果想访问同一对象,可以用单例模式
单例模式在Run()方法里面应该怎样写呢?
MuteG 2013-10-02
  • 打赏
  • 举报
回复
引用 9 楼 u011443241 的回复:
[quote=引用 7 楼 gaoyunpeng 的回复:] 如果你的handleMsg方法,是在一个单独的线程中(比如Timer)调用的,那么直接调用方法是不行的,因为你绑定数据源的时候,会造成DataGridView刷新,而控件刷新应该是发生在UI线程中,这属于跨线程操作UI界面,所以必须利用Invoke。
我确实new了一个线程用来负责客户端和服务器会话,
 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;
这个frm就是主窗体的对象,要是这么写的话会提示窗体句柄创建之前不能调用Invoke的错误。。[/quote] 线程的启动不要写在窗体的构造函数中,因为这时窗体并未创建完毕。 试试看写在窗体的Shown事件里。
feiyun0112 2013-09-30
  • 打赏
  • 举报
回复
很明显是2个form对象,如果想访问同一对象,可以用单例模式
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 10 楼 feiyun0112 的回复:
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
frm要是不new可以从Run()哪块传过来吗?
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 10 楼 feiyun0112 的回复:
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
frm就是登陆成功后new的一个新对象。。
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;
                        frm = new 申请及扫描();
                        frm.ContactWithServer = this;
                        frm.User = user;
                    }
                    break;
feiyun0112 2013-09-30
  • 打赏
  • 举报
回复
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
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 7 楼 gaoyunpeng 的回复:
如果你的handleMsg方法,是在一个单独的线程中(比如Timer)调用的,那么直接调用方法是不行的,因为你绑定数据源的时候,会造成DataGridView刷新,而控件刷新应该是发生在UI线程中,这属于跨线程操作UI界面,所以必须利用Invoke。
我确实new了一个线程用来负责客户端和服务器会话,
 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;
这个frm就是主窗体的对象,要是这么写的话会提示窗体句柄创建之前不能调用Invoke的错误。。
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 6 楼 happy09li 的回复:
[quote=引用 5 楼 u011443241 的回复:] [quote=引用 4 楼 happy09li 的回复:] dagvApp.DataSource = dt; dagvApp.AllowUserToAddRows = false; //不显示datagridview中的空白行 你dgv对应的字段绑定对了没有?
在窗体设置的时候弄了下,在代码里面也需要指定吗?[/quote] 代码里面不用,没道理呀,如果你dt有数据,不绑定也会显示数据啊[/quote]我还专门测试了下反序列化后的datatable中的数据,确实是有的。。我也非常纳闷,前面就是那么用的,就是把用委托绑定换成了用函数绑定,结果就不显示了
MuteG 2013-09-30
  • 打赏
  • 举报
回复
如果你的handleMsg方法,是在一个单独的线程中(比如Timer)调用的,那么直接调用方法是不行的,因为你绑定数据源的时候,会造成DataGridView刷新,而控件刷新应该是发生在UI线程中,这属于跨线程操作UI界面,所以必须利用Invoke。
熙风 2013-09-30
  • 打赏
  • 举报
回复
引用 5 楼 u011443241 的回复:
[quote=引用 4 楼 happy09li 的回复:] dagvApp.DataSource = dt; dagvApp.AllowUserToAddRows = false; //不显示datagridview中的空白行 你dgv对应的字段绑定对了没有?
在窗体设置的时候弄了下,在代码里面也需要指定吗?[/quote] 代码里面不用,没道理呀,如果你dt有数据,不绑定也会显示数据啊
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 4 楼 happy09li 的回复:
dagvApp.DataSource = dt; dagvApp.AllowUserToAddRows = false; //不显示datagridview中的空白行 你dgv对应的字段绑定对了没有?
在窗体设置的时候弄了下,在代码里面也需要指定吗?
熙风 2013-09-30
  • 打赏
  • 举报
回复
dagvApp.DataSource = dt; dagvApp.AllowUserToAddRows = false; //不显示datagridview中的空白行 你dgv对应的字段绑定对了没有?
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
引用 2 楼 happy09li 的回复:
调试下应该可以看出哪里出问题了
刚测试了下 服务器发来的datatable中有数据,实在不知道哪错了
熙风 2013-09-30
  • 打赏
  • 举报
回复
调试下应该可以看出哪里出问题了
w_angfei 2013-09-30
  • 打赏
  • 举报
回复
以前的用代理为啥DataGridView就能把数据显示出来,换成现在的函数调用就不行了,看了好久了,实在是搞不明白是啥情况,大家帮忙看看吧

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧