在TabControl中预加载选项卡以加快选项卡切换

时间:2012-08-15 19:21:52

标签: c# winforms tabcontrol

我有一个带有三个标签的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上叠加了一个图形,表明控件正在加载,然后我将其隐藏(不包含的代码)。它作为一种解决方法很有用,但不是一种优雅的解决方案。

3 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:1)

数据绑定控件不会更新,直到控件可见为止。解决方法是使其他选项卡可见。在表单可见之前切换到另一个选项卡并返回上一个选项卡并不起作用。 在你的后台主题中你可以做类似的事情:

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

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

答案 2 :(得分:0)

我只是通过Jacob编写代码,以便它可以用作函数

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