3

基本的な目標は、連絡先ごとに名刺を作成し、そのカードを FlowLayoutPanel に配置することです。カード自体は、約 10 個のラベルと 3 つのコンボボックスで構成されています。

名刺の数が多すぎても、パネルの初期作成に時間がかかりません。多分私はこれに対処する方法を見つけることができます

ただし、主な懸念事項はクラッシュです。約 200 枚程度のカードでクラッシュ (ハンドルがなくなる) するだけです。

ユーザーが一度に 1 つまたは 2 つの画面に収まる以上のものを見る必要がないため、実装できるページング メソッドがあることに同意しますが、ページング ルーチンを作成するのはかなり難しいかもしれません。

この計画された FlowLayoutPanel の効率を最大化する方法について何か提案はありますか?

PS 主な問題は、ハンドルが不足していることです (パネル内のコントロールが多すぎます)。速度を心配する前に、これを解決する必要があります。

4

1 に答える 1

0

さて、どうですか:

名刺を再作成するために必要な情報 (10 個のラベルと 3 個のコンボボックス) を格納するクラスを作成し、取得可能/設定可能なパブリック プロパティとして、空の既定のパブリック コンストラクターを使用します。次に、各名刺を xml (またはバイナリ) ファイルとしてXmlSerializer1 つのフォルダーにシリアル化します。string[] businessCards = Directory.GetFiles(Path.GetFullPath("mysettings\\businesscards"));次に、 「キャッシュされた」名刺の長いリストを反復処理するようなものを使用できます。FlowLayoutPanel次のような関数を呼び出して、アイテムの追加/削除を管理するクラスを用意しますSerializableBusinessCardClass GetNextCard() {}。これはかなり簡単に実装できます。シリアル化することもできますList<SerializableBusinessCardClass>最大の効率を得るために、単一の XML ファイルに約 5 個 (または一度に読み込みたい数) の長さを含めるか、本当にばかげた量の名刺がある場合 (フォルダーを参照するときにエクスプローラーが遅れるなど)。バイナリ シリアライゼーションの方が高速ですが、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;
        }

お役に立てれば。

于 2013-08-05T08:11:32.803 に答える