Хотите показать анимацию, пока datagridview заполняется данными - PullRequest
1 голос
/ 09 июня 2011

Здравствуйте, люди заполняют сетку данных при загрузке форм таким образом:

 private void Inventory_Load(object sender, EventArgs e)
    {

        AcidDBDataContext db = new AcidDBDataContext();

        BindingSource bs = new BindingSource();
        bs.DataSource = db.GetProducts.ToList();

        dgvInventory.DataSource = bs;
        ProductBindingNavigator.BindingSource = bs;

        ShowtoolStripButton2.Visible = false;

        foreach (DataGridViewColumn c in dgvInventory.Columns)
        {
            c.DefaultCellStyle.Font = new Font("Arial", 12.0F, GraphicsUnit.Pixel);
        }

    }

работает нормально, но есть одна проблема, мне нужно несколько секунд, и моя форма зависает. Как я могу это сделать, когда моя сетка данных заполняет анимацию загрузки шоу и когда сетка будет заполнена скрыть анимацию

Я использую C # winForms. Большое спасибо

1 Ответ

3 голосов
/ 09 июня 2011

Вы можете посмотреть в BackgroundWorkerThreads.

http://www.albahari.com/threading/part3.aspx

Я использовал их совсем немного при получении данных. Я хотел бы отобразить панель ожидания, вызвать событие DoWork, где данные извлекаются в набор данных (для нас это обычно занимает больше времени, чем присоединение указанных данных к сетке), затем в событии RunWorkerCompleted я прикрепил данные к сетке и скрыл бар ожидания Приложение все еще зависало на несколько секунд, но не так долго.

Вот пример кода. По сути, блокируйте поля, которые могут вызвать повторный вызов RefreshInventory (но поскольку вы загружаете при запуске, возможно, это не относится к вам). Затем извлеките данные из потока и прикрепите его, когда поток закончится.

public void RefreshInventory()
{
    // Lock any fields you want to lock during the update process
    // Display some kind of waiting or progress bar
    if (!bkgdWrkInventory.IsBusy)
        bkgdWrkInventory.RunWorkerAsync();
}

private void bkgdWrkInventory_DoWork(object sender, DoWorkEventArgs e)
{
    var db = new AcidDBDataContext();
    e.Result = db.GetProducts.ToList();
}

private void bkgdWrkInventory_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error == null)  // Check for errors
    {
        dgvInventory.DataSource = (List<Product>)e.Result;
    }
    else
    {
        // Show the error to the user
    }

    // Hide the waiting indicator
    // Unlock the fields
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...