2

3 つのタブを含む TabControl があります。各タブには DataGridView が含まれています。TabControl を初めて表示するとき、ソース データを 3 つの DataGridView のそれぞれにデータ バインドし、少し遅れて、TabControl がデフォルト (1 番目) のタブの画面に表示されます。

他の 2 つのタブのいずれかをクリックすると (初回のみ)、各タブが表示されるまでに非常に長い遅延があります。いずれかのタブが少なくとも 1 回表示されると、タブをすばやく自由に切り替えることができます。これらのタブをプリロードまたはプリレンダリングして、最初の表示でこの遅延が発生しないようにする方法はありますか?

おそらく、バックグラウンドのスレッドで何かを実行して、残りのタブをプリロードすることができます。あるいは、誰かが私のためにこれを行う TabControl の拡張機能を書いたのかもしれません。

どんな助けでも大歓迎です。

編集: krawl の要求に応じて、データを DataGridViews にバインドするために使用しているコードを次に示します。

public void LoadNewDataBase(string filename)
{
    //  Create the database connection
    mySQL.CreateNewDataBase(filename);

    // Display the DF DataSet
    dataGridViewDF.DataSource = GetDataSet("DF").Tables[0].DefaultView;
    dataGridViewSA.DataSource = GetDataSet("SA").Tables[0].DefaultView;
    dataGridViewGPS.DataSource = GetDataSet("GPS").Tables[0].DefaultView;

    dataGridViewDF.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    dataGridViewSA.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    dataGridViewGPS.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

    // Preload the tabs
    for (int i = tabControl1.TabCount - 1; i >= 0; i--)
    {
        tabControl1.SelectedIndex = i;
        tabControl1.Invalidate();
        tabControl1.Update();
    }
}

private DataSet GetDataSet(string tableName)
{
    DataSet ds = new DataSet();
    mySQL.GetDataSet("SELECT * FROM " + tableName).Fill(ds);
    return ds;
}

この操作はスレッド化されていません。私の問題の一時的な解決策として、各タブを反復処理して表示するための for ループを LoadNewDataBase メソッドに含めました。この操作をユーザーからわかりにくくするために、TabControl の上にグラフィックを重ねて、コントロールが読み込まれていることを示し、後でそれを非表示にします (そのためのコードは含まれていません)。回避策としては便利ですが、エレガントなソリューションではありません。

4

3 に答える 3

2

タブをロードしようとしている方法についてコードを投稿することをお勧めします。インターフェイスの遅延がまったくない次のコードでテストを実行しました。

    protected void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = GetTable();
        dataGridView2.DataSource = GetTable();
        dataGridView3.DataSource = GetTable();
    }

    private DataTable GetTable()
    {
        DataTable table = new DataTable();
        for (int i = 0; i < 6; i++)
        {
            table.Columns.Add("Col" + i.ToString(), typeof(string));
        }

        for (int i = 0; i < 1000; i++)
        {
            table.Rows.Add(GetRandomString(), GetRandomString(), GetRandomString(), GetRandomString(), GetRandomString(), GetRandomString());
        }

        return table;
    }


    private Random rand = new Random();
    private string validChars = "0123456789abcdefghijklmnopqurstuvwyz";

    private string GetRandomString()
    {
        StringBuilder builder = new StringBuilder();

        char[] c = new char[rand.Next(15, 20)];
        for (int i = 0; i < c.Length; i++)
        {
            c[i] = validChars[rand.Next(0, validChars.Length - 1)];
        }

        return new string(c);
    }
于 2012-08-15T20:55:24.507 に答える
1

データ バインド コントロールは、コントロールが表示されるまで更新されません。回避策は、他のタブを表示することです。別のタブに切り替えて、フォームが表示される直前に前のタブに戻ることができません。バックグラウンド スレッドでは、次のようなことができます。

tabControl.SelectedTab = tabPage2; 
tabPage2.BindingContextChanged += (_, __) => 
     tabControl.SelectedTab = tabPage1; 

tabControl.SelectedTab = tabPage3;
tabPage3.BindingContextChanged += (_, __) => 
     tabControl.SelectedTab = tabPage1; 
于 2012-08-15T22:33:02.363 に答える