When the form is frozen, it means the UI thread is too busy and so even if you try to show a loading animation, it will not animate. You should load data asynchronously.
You can have an async
method which returns Task<DataTable>
like the GetDataAsync
method which you can see in this post. Then call it in an async
event handler. In the event handler, first show the loading image, then load data asynchronously and at last hide the loading image.
You can simply use a normal PictureBox
showing a gif animation as loading control. Also you may want to take a look at this post to show a trasparent loading image.
public async Task<DataTable> GetDataAsync(string command, string connection)
{
var dt = new DataTable();
using (var da = new SqlDataAdapter(command, connection))
await Task.Run(() => { da.Fill(dt); });
return dt;
}
private async void LoadDataButton_Click(object sender, EventArgs e)
{
loadingPictureBox.Show();
loadingPictureBox.Update();
try
{
var command = @"SELECT * FROM Category";
var connection = @"Your Connection String";
var data = await GetDataAsync(command, connection);
dataGridView1.DataSource = data;
}
catch (Exception ex)
{
//Handle Exception
}
loadingPictureBox.hide();
}