我用线程将dataset写入datagridview,但是写完后滚动条就死了,麻烦各位大大帮我看看程序

GUNDAM525 2010-01-06 10:25:49

#region 用多线程测试
delegate void SetVisibleDelegate();
Thread DataViewsThread;
DataSet DataViewsSet = new DataSet();
private void BindThread()
{
//Control.CheckForIllegalCrossThreadCalls = false;
ThreadStart bind = new ThreadStart(SetDataGridView);
DataViewsThread = new Thread(bind);
DataViewsThread.Start();
}

private void CheckIsIn()
{
if (this.InvokeRequired)
{
SetVisibleDelegate d = new SetVisibleDelegate(BindThread);
this.Invoke(d);
//this.DataViews.Invoke(d);
}
else
{
BindThread();
}
}

private void SetDataGridView() //控件操作
{

DataViewsSet = oraCls.createView(dateTimePicker1.Value.ToString("yyyyMMdd"), dateTimePicker2.Value.ToString("yyyyMMdd"), myFilter());//, bindingNavigator1);

DataViews.AutoGenerateColumns = true;
DataViews.DataSource = DataViewsSet.Tables[0];


for (int i = 0; i < DataViews.Columns.Count; i++)
{
DataViews.Columns[i].HeaderCell.Style.WrapMode = DataGridViewTriState.False;
}

//将字段名写入listBox
for (int j = 0; j < DataViews.ColumnCount; j++)
LstBx_All.Items.Add(DataViews.Columns[j].Name);

DataViews.Refresh();
LB_Count.Text = "记录数:" + (DataViews.RowCount - 1).ToString();
}

#endregion
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjsxsea108 2011-11-04
  • 打赏
  • 举报
回复
有高手能解决吗,等,我也碰到了
GUNDAM525 2010-01-07
  • 打赏
  • 举报
回复
有人有什么好的方法或建议吗,谢谢各位,急等
byshome 2010-01-06
  • 打赏
  • 举报
回复
没有看懂你的写法,你每次调用Invoke时,好像都是采用线程来执行的,
private delegate void delegateFunction();
private void ThreadFun()
{
ThreadStart bind = new ThreadStart(InvokeFun);
DataViewsThread = new Thread(bind);
DataViewsThread.Start();

}
private void InvokeFun()
{
if (this.InvokeRequired)
{
delegateFunction d = new delegateFunction(InvokeFun);//这里应该指向自己,而不是线程
this.Invoke(d);
}
else
{
//执行实际绑定代码
}

}
kensouterry 2010-01-06
  • 打赏
  • 举报
回复
private void BindThread()
{
//Control.CheckForIllegalCrossThreadCalls = false;
ThreadStart bind = new ThreadStart(SetDataGridView);
DataViewsThread = new Thread(bind);
DataViewsThread.Start();
//加上这个等线程终止吧!
Thread.Sleep(100);
}
kensouterry 2010-01-06
  • 打赏
  • 举报
回复
死了多久啊,不是跟主线程分开了吗?看看是不是死循环了!
GUNDAM525 2010-01-06
  • 打赏
  • 举报
回复
急求帮助,谢谢
GUNDAM525 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 javak 的回复:]
private void SetDataGridView()  //控件操作 
        {
DataViews.BeginUpdate();
...
DataViews.EndUpdate();
}

这样试试
[/Quote]
没有这两个属性啊
JavaK 2010-01-06
  • 打赏
  • 举报
回复
private void SetDataGridView() //控件操作
{
DataViews.BeginUpdate();
...
DataViews.EndUpdate();
}

这样试试
GUNDAM525 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 byshome 的回复:]
没有看懂你的写法,你每次调用Invoke时,好像都是采用线程来执行的,
private delegate void delegateFunction();
private void ThreadFun()
{
ThreadStart bind = new ThreadStart(InvokeFun);
            DataViewsThread = new Thread(bind);
            DataViewsThread.Start();

}
private void InvokeFun()
{
if (this.InvokeRequired)
{
    delegateFunction d = new delegateFunction(InvokeFun);//这里应该指向自己,而不是线程
    this.Invoke(d);
}
else
{
//执行实际绑定代码
}

}
[/Quote]
按照你这么些确实可以结束,但是在执行的过程中整个界面都假死,还不如直接调用绑定呢,呵呵

111,120

社区成员

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

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

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