如何最大限度地提高FlowLayoutPanel的效率?

时间:2012-09-24 14:35:13

标签: c# flowlayoutpanel

基本目标是为每个联系人创建一张名片,并将该卡放入FlowLayoutPanel。该卡本身由大约10个标签和3个组合框组成。

不需要太多名片就会导致面板的初始填充需要很长时间。也许我可以找到一种方法来处理这个

然而,主要担心的是崩溃。它只需要大约200张卡就会崩溃(用完把手)。

我同意有可以实现的分页方法,因为用户永远不需要看到一次只能适应1或2个屏幕,但编写分页例程可能非常困难。

有关如何最大限度地提高此计划FlowLayoutPanel效率的任何建议?

P.S。主要问题是手柄耗尽(面板中的控件太多)。在担心速度之前必须先解决这个问题。

1 个答案:

答案 0 :(得分:0)

好的,怎么样:

创建一个类,用于存储重新创建名片所需的信息(10个标签和3个组合框)作为public,gettable / settable属性,以及一个空的默认公共构造函数。然后,使用XmlSerializer将每个名片序列化为xml(或二进制)文件到一个文件夹中。然后,您可以使用类似string[] businessCards = Directory.GetFiles(Path.GetFullPath("mysettings\\businesscards"));的内容来遍历您的长“缓存”名片列表。通过调用以下函数来管理在FlowLayoutPanel中添加/删除项目的课程:SerializableBusinessCardClass GetNextCard() {}。这实现起来相当简单。您还可以将长度约为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;
        }

希望这有帮助。