基本目标是为每个联系人创建一张名片,并将该卡放入FlowLayoutPanel。该卡本身由大约10个标签和3个组合框组成。
不需要太多名片就会导致面板的初始填充需要很长时间。也许我可以找到一种方法来处理这个
然而,主要担心的是崩溃。它只需要大约200张卡就会崩溃(用完把手)。
我同意有可以实现的分页方法,因为用户永远不需要看到一次只能适应1或2个屏幕,但编写分页例程可能非常困难。
有关如何最大限度地提高此计划FlowLayoutPanel效率的任何建议?
P.S。主要问题是手柄耗尽(面板中的控件太多)。在担心速度之前必须先解决这个问题。
答案 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;
}
希望这有帮助。