【问题标题】:ComboBox slow to populate with DataSourceComboBox 填充数据源的速度很慢
【发布时间】:2016-06-28 21:34:03
【问题描述】:
public class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MainWindow());
    }
} 

class MainWindow : Form
{
    string[] list = new string[1548];
    TableLayoutPanel panel = new TableLayoutPanel();

    public MainWindow() : base()
    {
        Height = 2000;
        Width = 1000;

        Random rand = new Random();

        for (int i = 0; i < 1548; i++)
        {
            list[i] = rand.Next().ToString();
        }

        Button button = new Button();
        button.Text = "Press me";
        button.Click += Button_Click;

        panel.Controls.Add(button, 0, 0);

        panel.Height = 2000;
        panel.Width = 1000;

        Controls.Add(panel);

        Show();
    }

    private void Button_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 36; i++)
        {
            ComboBox box = new ComboBox();
            box.DataSource = list;

            panel.Controls.Add(box, 0, i+1);
        }
    }
}

这里将创建一个带有按钮的窗口,并将预先生成一个包含 1548 个随机整数的列表。

当您按下按钮时,将创建 36 个组合框并使用预生成的列表进行填充。它会挂起一两秒钟。

换成box.Items.AddRange(list);会更慢。

如果您现在评论行box.DataSource = list;,它会明显更快。

我不明白为什么将数据源绑定到comboBox 需要这么长时间。我猜这与绘制下拉菜单有关。

不管怎样,我在程序中使用的comboBoxes 都是一样的。它们显示相同的列表,但绑定到不同的“数据槽”(它们使您能够选择库存物品 - 每个槽的物品列表都相同,但选择的内容不同)。

有什么方法可以强制程序仅绘制一个 ComboBox 并将其用于所有 36 个? Od 做类似的事情。让它做同样的事情 36 次似乎是在浪费资源......

这会加快程序的启动时间。

【问题讨论】:

    标签: c# winforms performance combobox


    【解决方案1】:

    我不明白为什么要将数据源绑定到comboBox 需要这么长时间。我猜这与绘制下拉菜单有关。

    我不知道您是如何实施解决方案的,但这不正常。我首先建议您:

    使用要显示的组合框数量创建一个循环

    for(x = 0; x < 36; x++)
    {
    
    }
    

    初始化你的组合框并绑定她,最后存储到一个数据结构中

    //intialize combobox
    ComboBox cmb = new ComboBox();
    
    //populate with a Datasource
    
    List<ComboBox> lstCmb = new List<ComboBox>();
    
    for(x = 0; x < 36; x++)
    {
        // store controller into an data strucuture
        lstCmb.Add(cmb);
    }
    

    所有组合框都预先填充并加载到该数据结构中,您只需要使用这 36 个组合框之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多