Отображать сообщение о загрузке до полного извлечения данных SQL
Я пользуюсь костюмным костюмом WeifenLuo.
Мне нужно показать какую-то всплывающую форму или сообщение о загрузке, прежде чем SQL завершит загрузку данных.
То, что я пробовал, не сработало
public partial class frmPostventa : DockContent
{
private void frmPostventa_Load(object sender, EventArgs e)
{
bool done = false;
ThreadPool.QueueUserWorkItem((x) =>
{
using (var splashForm = new SplashForm())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
});
//Database task heavy load
cargarDatos();
done = true;
}
public void cargarDatos()
{
string strSQL = "exec SAI_ALGO.spPostventa";
SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strCon);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
// Populate a new data table and bind it to the BindingSource.
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource1.DataSource = table;
}
}
РЕДАКТИРОВАТЬ: Добавлено CargarDatos()
1 ответ
DoEvents()
почти всегда приводит к очень плохому месту, и его следует всегда избегать. Проблема с этой конкретной реализацией в том, что ваш длительный процесс (cargarDatos()
) будет блокировать поток пользовательского интерфейса до его завершения, поэтому DoEvents()
не будет иметь никакого эффекта; он не будет прерывать метод во время его выполнения (при условии cargarDatos()
не делает что-то внутренне, что приведет к потоку). Кроме того, создание и взаимодействие с элементом управления UI из некоторого фонового потока здесь недопустимо.
Вы должны использовать BackgroundWorker
чтобы выполнить длительную операцию и повысить статус обновления пользовательского интерфейса: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx