C#gif没有加载 -

时间:2017-03-21 17:09:28

标签: c#

我有一个表单,可以在点击按钮时从DataGridView运行查询。下面的代码与我期望的一样;

  1. 打开一个表单“请等待查询运行”
  2. 运行查询
  3. 加载时关闭表单,然后使用。填充DataGridView 数据。
  4. 我添加了一个带有简单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()而感到有些坚持,但是感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

我在your comment中读到您使用.NET 4.0,因此无法将awaitasyncTask<>一起使用。

在.NET 4.5之前,您可以使用ThreadBackgroundWorker来实现此目标,
请参阅以下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;
}