读书人

C# WinForm DataGridView显示数据有

发布时间: 2013-10-09 22:26:11 作者: rapoo

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对象,如果想访问同一对象,可以用单例模式

读书人网 >C#

热点推荐