2

我有一个 TabControl,里面有三个选项卡。每个选项卡都包含一个 DataGridView。当我第一次显示 TabControl 时,我将源数据数据绑定到三个 DataGridView 中的每一个,经过一段时间的延迟,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 顶部覆盖了一个图形以指示控件正在加载,然后我将其隐藏(不包括代码)。它作为一种解决方法很有用,但不是一个优雅的解决方案。

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 回答
0

我只是用 Jacob 整理了代码,以便它可以用作函数

private void next_TabPage(TabPage tabpage1, TabPage tabpage2)
    {
        TabControl.SelectedTab = tabpage2;
        tabpage2.BindingContextChanged += (_, __) =>
        TabControl.SelectedTab = tabpage1;
    }
于 2018-02-08T06:19:20.717 回答