我有一个表单,可以在点击按钮时从DataGridView
运行查询。下面的代码与我期望的一样;
我添加了一个带有简单gif的图片框 - 纯粹是为了用户界面和用户看到它正在工作。但是gif实际上并没有旋转 - 只是显示为图片。测试它,如果我自己在一个表单上运行它就可以了,我只能猜测运行的查询是否会阻止它运行它应该如何。
PleaseWaitForm pleaseWait = new PleaseWaitForm();
try
{
pleaseWait.Show();
Application.DoEvents();
this.singleCenTableAdapter.Fill(this.singleCenData.SingleCenTable, ((System.DateTime)(System.Convert.ChangeType(txtBookFrom.Text, typeof(System.DateTime)))), ((System.DateTime)(System.Convert.ChangeType(txtBookTo.Text, typeof(System.DateTime)))));
int RowC = singleCenTableDataGridView.RowCount;
pleaseWait.Close();
if (RowC == 0)
{
MessageBox.Show(GlobVar.NoResults, "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
pleaseWait.Close();
}
catch (System.Exception exc)
{
GlobVar.vid.Open();
var LogName = GlobVar.LoginName.ExecuteScalar();
GlobVar.vid.Close();
MessageBox.Show
(
"An error has occured " + LogNam + ". Please try again. \n\n" +
exc.Message, "An error has occured", MessageBoxButtons.OK, MessageBoxIcon.Warning
);
}
finally
{
pleaseWait.Close();
}
“请等待”表格只是一个标签&图片,所以除了那里的Initalize之外什么都没有;
public PleaseWaitForm()
{
InitializeComponent();
}
有人对如何解决这个问题有任何想法,使其正常工作吗?或者我做错了什么特别的事情?我知道大多数情况下我可能会因为使用Application.DoEvents()
而感到有些坚持,但是感谢任何帮助!
答案 0 :(得分:2)
我在your comment中读到您使用.NET 4.0,因此无法将await
和async
与Task<>
一起使用。
在.NET 4.5之前,您可以使用Thread
或BackgroundWorker
来实现此目标,
请参阅以下BackgroundWorker
的示例:
Background Worker loading screen in Winforms
您当前的代码在同步中运行,您希望它能够以异步工作。
答案 1 :(得分:0)
您需要string value = "3,14";
value = value.Replace(",",".");
double314 = double.Parse(value,System.Globalization.NumberStyles.AllowDecimalPoint);
和async
来保持用户界面的响应能力。
首先将此代码的方法放在await
中,如下所示:
async
接下来将以下代码放入新方法中:
private async void Method()
{
...
}
例如:
this.singleCenTableAdapter.Fill(this.singleCenData.SingleCenTable, ((System.DateTime)(System.Convert.ChangeType(txtBookFrom.Text, typeof(System.DateTime)))), ((System.DateTime)(System.Convert.ChangeType(txtBookTo.Text, typeof(System.DateTime)))));
int RowC = singleCenTableDataGridView.RowCount;
最后,将您的try块更改为:
private async Task<int> FillAndGetRowCount( ... ) // add parameters if needed
{
this.singleCenTableAdapter.Fill(this.singleCenData.SingleCenTable, ((System.DateTime)(System.Convert.ChangeType(txtBookFrom.Text, typeof(System.DateTime)))), ((System.DateTime)(System.Convert.ChangeType(txtBookTo.Text, typeof(System.DateTime)))));
return singleCenTableDataGridView.RowCount;
}