如何最大化FlowLayoutPanel的效率?

3
基本目标是为每个联系人创建一个名片,并将该名片放入FlowLayoutPanel中。该名片本身由大约10个标签和3个组合框组成。
当面板的初始填充量较大时,会导致初始化时间过长。也许我可以找到一种方法来处理这个问题。
然而,一个主要问题是崩溃。只需要200张左右的名片就会崩溃(耗尽句柄)。
我同意,有分页方法可以实现,因为用户永远不需要看到超过1或2个屏幕容量的内容,但编写分页程序可能会很困难。
如何最大化计划中FlowLayoutPanel的效率?有什么建议吗?
附:主要问题是句柄用尽(面板中控件太多)。在担心速度之前必须解决此问题。

感谢您的快速回复,Rene。我的主要关注点是句柄耗尽的问题。如果我不能解决这个问题,那么担心速度也没有意义。 - user1646737
1
你别无选择,只能将你的流式布局设为虚拟的(或者分页,以更方便的方式)。 - rene
我本来就有些担心。每张名片上都有一些组合框,所以我不能只将它们呈现为位图。这让我尝试实现某种分页方法。我可以自己试着解决,但希望有人之前已经做过这个并能指向一个例子。 - user1646737
5
一种明显的解决方案是使用一个联系人姓名的列表框和一张商务名片来查看/编辑所选的名片。 - Hans Passant
1
窗口句柄的最大数量为10K,这是Windows核心的限制,您无法跨越它。唯一可能的解决方案是分页。 - shfire
显示剩余3条评论
1个回答

0

好的,那么怎么样:

创建一个类来存储重新创建名片所需的信息(10个标签和3个组合框),作为公共的、可获取/可设置的属性,并带有一个空的默认公共构造函数。然后,使用XmlSerializer将每张名片序列化为xml(或二进制)文件,并保存到单个文件夹中。接下来,您可以使用类似于string[] businessCards = Directory.GetFiles(Path.GetFullPath("mysettings\\businesscards"));的代码来遍历您长时间“缓存”的名片列表。通过调用像SerializableBusinessCardClass GetNextCard() {}这样的函数来管理从您的FlowLayoutPanel中添加/删除项目的类。这将非常容易实现。您还可以将长度约为5(或任何您想要一次加载的数量)的List<SerializableBusinessCardClass>序列化为单个XML文件,以获得最大效率,或者如果您拥有真正荒谬的数量的名片(以至于浏览文件夹时资源管理器会出现延迟)。虽然二进制序列化速度更快,但XML方法的附加好处是,您的客户可以通过自己创建XML文件来指定他们想要您显示的新名片。

在这里,我将给您一个具体的示例,说明如何构建和序列化这样的数据结构:

public class SerializableBusinessCard
{
    public SerializableBusinessCard()       { }
    public string Name                      { get; set; }
    public string Company                   { get; set; }
    public List<string> Labels              { get; set; }
    public List<ComboItem> ComboBoxes       { get; set; }

}

public class ComboItem
{   
    public ComboItem()              { }
    public string Name              { get; set; }
    public string Text              { get; set; }
    public int SelectedIndex        { get; set; }
    public Point Location           { get; set; }
    public Size size                    { get; set; }
    public List<string> Collection{ get; set; }
}

使用方法:

    public void stackoverflow_BusinessCard_FlowLayoutPanel()
    {
        List<string> labels = new List<string>();

        labels.Add("Title");
        labels.Add("Description");
        labels.Add("Phone");
        labels.Add("Email");
        labels.Add("Address");
        labels.Add("label6");
        labels.Add("labelN");


        ComboItem cItem = new ComboItem();

        cItem.Collection = new List<string>();
        cItem.Collection.Add("Option1");
        cItem.Collection.Add("Option2");

        cItem.Name = "comboName";
        cItem.SelectedIndex = 0;
        cItem.Text = cItem.Collection[cItem.SelectedIndex];
        cItem.Location = new Point(50, 265);
        cItem.size = new Size(100,21);

        List<ComboItem> comboItems = new List<ComboItem>();
        comboItems.Add(cItem);


        SerializableBusinessCard bCard1 = new SerializableBusinessCard();

        bCard1.Name         = "CompanyXYZ_BlueTheme";
        bCard1.Company      = "CompanyXYZ";
        bCard1.Labels       = labels;
        bCard1.ComboBoxes   = comboItems;

        SerializeObjectXML("BusinessCard_392.xml",bCard1);

        SerializableBusinessCard loaded = DeserializeBusinessCardXML("BusinessCard_392.xml");
    }

这是序列化函数:

    public void SerializeObjectXML(string filename,object obj)
    {
        using(StreamWriter streamWriter = new StreamWriter(filename))
        {
            XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
            xmlSerializer.Serialize(streamWriter,obj);
        }
    }

结果:

<?xml version="1.0" encoding="utf-8"?>
<SerializableBusinessCard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>CompanyXYZ_BlueTheme</Name>
  <Company>CompanyXYZ</Company>
  <Labels>
    <string>Title</string>
    <string>Description</string>
    <string>Phone</string>
    <string>Email</string>
    <string>Address</string>
    <string>label6</string>
    <string>labelN</string>
  </Labels>
  <ComboBoxes>
    <ComboItem>
      <Name>comboName</Name>
      <Text>Option1</Text>
      <SelectedIndex>0</SelectedIndex>
      <Location>
        <X>50</X>
        <Y>265</Y>
      </Location>
      <size>
        <Width>100</Width>
        <Height>21</Height>
      </size>
      <Collection>
        <string>Option1</string>
        <string>Option2</string>
      </Collection>
    </ComboItem>
  </ComboBoxes>
</SerializableBusinessCard>

以及反序列化器:

        public static SerializableBusinessCard DeserializeBusinessCardXML(string filename)
        {
            SerializableBusinessCard result = new SerializableBusinessCard();
            using(StreamReader streamReader = new StreamReader(filename))
            {
                XmlSerializer xmlReader = new XmlSerializer(typeof(SerializableBusinessCard));
                result = (SerializableBusinessCard) xmlReader.Deserialize(streamReader);
            }
            return result;
        }

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接