Есть ли проблема только с полосами прокрутки?
Если ваш код все еще находится в главном потоке, ваша форма ничего не может сделать (вам нужна двойная проверка)
Но это правда, вы можно использовать Application.DoEvents();
после завершения sh привязать данные к gridView. Этот метод остановит все потоки и обновит представление, пожалуйста, убедитесь, что это не идеальное решение, этот метод иногда будет приводить к необратимым ошибкам в условиях перекрестного потока.
В любом случае, я надеюсь использовать System.Windows.Forms.Timer
, чтобы сделать это просто.
Вот пример.
После запуска формы таймер сработает 100 раз, а интервал составит 5 секунд.
private int loopCnt = 1;
// you don't need to this, just drag timer component from a "tool box"
// to your form any where at design time(mode).
// private System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
private void Form1_Load(object sender, EventArgs e)
{
//it is up to you start timer at form-load or triggering after some button click.
//this.loopCnt = 1;
this.timer1.Enabled = true;
this.timer1.Interval = 1000 * 5;
this.timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
CreateDataAndBind(loopCnt++);
if(loopCnt > 100)
{
this.timer1.Stop();
}
}
public void CreateDataAndBind(int loopCount)
{
DataSet dsTemp = new DataSet();
#region : Define data Table and columns
DataTable dtTemp = new DataTable();
DataColumn dColKey = new DataColumn("key", typeof(int));
DataColumn dColName = new DataColumn("name", typeof(String));
dtTemp.Columns.Add(dColKey);
dtTemp.Columns.Add(dColName);
dtTemp.Columns.Add(new DataColumn("role"));
dtTemp.Columns.Add(new DataColumn("timeText", typeof(String)));
dtTemp.Columns.Add(new DataColumn("timeValue", typeof(DateTime)));
#endregion
dsTemp.Tables.Add(dtTemp);
for (int index = 0; index < 10; index++)
{
DataRow dRow = dtTemp.NewRow();
dRow[0] = loopCount;
dRow[1] = "jornathan";
dRow[2] = "Developer";
dRow[3] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
dRow[4] = DateTime.Now;
dtTemp.Rows.Add(dRow);
}
this.BindDataSet(dsTemp);
}
public delegate void updateDataSetDelegate(DataSet ds);
private void BindDataSet(DataSet ds)
{
if (this.dataGridView1.InvokeRequired)
{
this.Invoke(new updateDataSetDelegate(BindDataSet), new object[] { ds });
}
else
{
this.dataGridView1.DataSource = ds.Tables[0];
}
}