|来自另一个线程的C#| DataGridView.Add()不生成滚动条
我有一个问题,DataGridView从另一个线程获取数据。 我的英语不是最好的,所以下面是代码:|来自另一个线程的C#| DataGridView.Add()不生成滚动条,c#,multithreading,winforms,datagridview,scrollbar,C#,Multithreading,Winforms,Datagridview,Scrollbar,我有一个问题,DataGridView从另一个线程获取数据。 我的英语不是最好的,所以下面是代码: private void TaskLoad() { List<taskafterdb> tasklist = new List<taskafterdb>(); this.tasklistTableAdapter.FillTaskBoard(sHADOWv5_testDataSet.tasklist) var s = from x in sHADOWv
private void TaskLoad()
{
List<taskafterdb> tasklist = new List<taskafterdb>();
this.tasklistTableAdapter.FillTaskBoard(sHADOWv5_testDataSet.tasklist)
var s = from x in sHADOWv5_testDataSet.tasklist
orderby x.DATE ascending
select x;
dgv_tasks.DataSource = s.AsDataView();
foreach (var task in sHADOWv5_testDataSet.tasklist)
{
tasklist.Add(new taskafterdb { DATE = task.DATE, COLOR = task.COLOR });
}
tasklist = tasklist.OrderBy(t => t.DATE).ToList();
dgv_tasks.DataSource = tasklist;
foreach (DataGridViewColumn column in dgv_tasks.Columns)
{
column.Frozen = false;
}
dgv_tasks.Columns["TASK"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv_tasks.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
dgv_tasks.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgv_tasks.ScrollBars = ScrollBars.Both;
dgv_tasks.Controls[0].Enabled = true;
dgv_tasks.Controls[1].Enabled = true;
}
然后,滚动条消失了。。。有一点空间,但没有更多。
我可以用鼠标滚动,或者用箭头键滚动,但仅此而已
谢谢你的帮助!:) 以下是您需要做的事情,以提高性能并解决您的问题
我在电话上写的,所以不能给你看一个示例代码。如果您仍然被卡住,请告诉我,稍后我将向您展示一些示例代码。通常,如果您有后台线程,该线程中的代码不应与UI线程交互。设置数据源和调用Form1_Resize是明显的UI调用,因此需要重构。线程上的
Abort()
是一种代码气味:请参阅谢谢您警告我!在这种情况下,这并不重要,因为iSharedWorkOne布尔值,但在其他情况下,您迫使我重新思考我的代码。。。再次感谢!:)谢谢你,它更好,但仍然不是最好的。。。我将根据您的说明改进代码,如果有效,我将标记您的作为答案!谢谢,祝你圣诞快乐:)好了,现在没那么重要了。。。我在淡入时使用.visible
解决了GUI故障。我相信你的解决方案是完美的,只是我的代码太复杂了,所以我接受这个答案。非常感谢。
static public Thread dohardwork;
public void Form1_Load(object sender, EventArgs e)
{
dohardwork = new Thread(hardwork);
dohardwork.Start();
}
private void hardwork()
{
TaskLolad();
Form1_Resize(this, null);
IsHardworkDone = true;
fadeintimer.Enabled = true;
dohardwork.Abort();
}