1

flowLayoutPanel1これらのラベルのテキストを Excel にエクスポートしようとして、いくつかの動的ラベルを生成する小さなプログラムがありますが、取得できるのは最後のラベルの値だけです。

これは私のエクスポートクラスです:

 class Export
    {

        public Export(bool defaultBackgroundIsWhite)
        {
            this.defaultBackgroundIsWhite = defaultBackgroundIsWhite;

            app = new Application();
            app.Visible = true;
            workbook = app.Workbooks.Add(1);
            worksheet = (Worksheet)workbook.Sheets[1];
        }

        public void Do(string excelName, System.Windows.Forms.Label names)
        {
            for (int i = 0; i <= 5; i++)
            {
                    AddNames(i,0,names);
            }
        }

        private void AddNames(int row, int col, System.Windows.Forms.Label lbls)
        {
            if (lbls == null) return;
            row++;
            col++;
            Range range = worksheet.Cells[row + 2, col + 2];
            range.NumberFormat = "";
            worksheet.Cells[row + 2, col + 2] = lbls.Text;
            row--;
            col--;

        }
        private Application app = null;
        private Workbook workbook = null;
        private Worksheet worksheet = null;
        private bool defaultBackgroundIsWhite;
    }

フォーム クラス コード:

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        create();
    }

    Label lbl;
    private void create()
    {
        flowLayoutPanel1.Controls.Clear();
        //int length = ds.Tables[0].Rows.Count;
        for (int i = 0; i < 5; i++)
        {
            lbl = new Label();
            lbl.Name = i.ToString();
            lbl.Text = "Label "+i;
            lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
            lbl.SetBounds(0, 20, 100, 25);
            lbl.BorderStyle = BorderStyle.FixedSingle;
            flowLayoutPanel1.Controls.Add(lbl);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Export ep = new Export(true);
        ep.Do("test.xsl", lbl);
    }

私の結果:

ここに画像の説明を入力

4

3 に答える 3

3

参照を渡すだけなので、最後に作成されたラベルのテキストを常に追加しています。代わりに、Excel にエクスポートするテキスト プロパティのすべてのラベルの参照を含むリストを渡す必要があります。これらのメソッドを変更します:

    List<Label> lbls;
    private void create()
    {
        flowLayoutPanel1.Controls.Clear();
        //int length = ds.Tables[0].Rows.Count;
        lbls = new List<Labels>();
        for (int i = 0; i < 5; i++)
        {
            Label lbl = new Label();
            lbl.Name = i.ToString();
            lbl.Text = "Label "+i;
            lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
            lbl.SetBounds(0, 20, 100, 25);
            lbl.BorderStyle = BorderStyle.FixedSingle;
            flowLayoutPanel1.Controls.Add(lbl);
            lbls.Add(lbl);
        }
    }

また、代わりに受け入れるようにクラスのメソッドを変更しDoます。ExportList<Label>Label

    public void Do(string excelName, List<Label> names)
    {
        for (int i = 0; i <= names.Count; i++)
        {
                AddNames(i,0,names[i]);
        }
    }
于 2013-03-20T23:16:46.643 に答える
2
List<Label> lbls = new List<Label>();
private void create()
{
    flowLayoutPanel1.Controls.Clear();
    //int length = ds.Tables[0].Rows.Count;
    for (int i = 0; i < 5; i++)
    {
        lbl = new Label();
        lbl.Name = i.ToString();
        lbl.Text = "Label "+i;
        lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
        lbl.SetBounds(0, 20, 100, 25);
        lbl.BorderStyle = BorderStyle.FixedSingle;
        lbls.Add(lbl);   //< -- add the label to the local list of Labels
        flowLayoutPanel1.Controls.Add(lbl);

    }
}

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    Export ep = new Export(true);
    foreach(var lbl in lbls)
    {
        i++;
        ep.AddNames(i,0,lbl);
    }
}

public void AddNames(int row, int col, System.Windows.Forms.Label lbl)
{
if (lbl == null) return;
row++;
col++;
Range range = worksheet.Cells[row + 2, col + 2];
range.NumberFormat = "";
worksheet.Cells[row + 2, col + 2] = lbl.Text;
row--;
col--;

}
于 2013-03-20T23:15:35.670 に答える
2

create() メソッドの for ループのたびに新しいラベルを作成し、そのラベルを同じフィールド (lbl) に割り当てています。完了すると、lbl が最後に作成したラベルになります。代わりに、リストにラベルを追加するか、エクスポートするラベルのみが確実に含まれる場合は、flowLayoutPanel1.Controls を go() メソッドに渡すことができます。

これは少しぎこちない TBH であり、そのような UI の仕組みに大きく依存することはお勧めしません。UI がデータにバインドされているよく考えられたモデルを使用する方がはるかに優れていますが、単に取得したい場合は、それはあなたの問題です。

于 2013-03-20T23:16:02.417 に答える