簡體   English   中英

在TabControl中預加載選項卡以加快選項卡切換

[英]Pre-load tabs in a TabControl to speed up tab switching

我有一個帶有三個標簽的TabControl。 每個選項卡都包含一個DataGridView。 當我第一次顯示TabControl時,我將源數據存儲到三個DataGridViews中的每一個,並且在一些延遲之后,TabControl出現在默認(第一個)選項卡的屏幕上。

當我單擊其他兩個選項卡中的任何一個(僅限第一次)時,在顯示每個選項卡之前會有非常長的延遲。 一旦任何標簽至少顯示一次,我就可以非常快速地在標簽之間自由切換。 有沒有什么方法可以預先加載或預渲染這些標簽,這樣我就不會在第一個顯示器上遇到這種延遲?

也許我可以在后台的線程中做一些事情來預加載剩余的標簽。 或者也許有人編寫了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上疊加了一個圖形,表明控件正在加載,然后我將其隱藏(不包含的代碼)。 它作為一種解決方法很有用,但不是一個優雅的解決方案。

我建議發布一些關於如何加載標簽的代碼。 我使用以下代碼執行了測試,沒有任何接口延遲。

    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);
    }

在控件可見之前,數據綁定控件不會更新。 解決方法是使其他選項卡可見。 在表單可見之前切換到另一個選項卡並返回上一個選項卡不起作用。 在你的后台線程中,你可以做類似的事情:

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

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

我只是通過Jacob編寫代碼,以便它可以作為一個函數使用

private void next_TabPage(TabPage tabpage1, TabPage tabpage2)
    {
        TabControl.SelectedTab = tabpage2;
        tabpage2.BindingContextChanged += (_, __) =>
        TabControl.SelectedTab = tabpage1;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM