Pertanyaan Winforms TableLayoutPanel menambahkan baris secara terprogram


Saya telah berjuang dengan ini untuk sementara waktu, dan telah menemukan bahwa sejumlah orang lain berjuang dengan TableLayoutPanel (.net 2.0 Winforms) juga.

Masalah

Saya mencoba untuk mengambil tablelayoutpanel 'kosong', yang memiliki 10 kolom yang ditentukan, kemudian saat runtime secara terprogram menambahkan deretan kontrol (yaitu satu kontrol per sel).

Orang mungkin berpikir bahwa itu harus sesederhana itu

myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */);

Tapi itu (untuk saya) tidak menambahkan baris. Jadi mungkin menambahkan gaya berjajar

myTableLayoutPanel.RowStyles.Clear();
myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));

Tapi itu juga tidak berhasil. Saya telah menggali dan menemukan bahwa myTableLayoutPanel.RowCount perubahan penggunaan dari waktu desain ke run time, maka lakukan myTableLayoutPanel.RowCount++; tidak benar-benar menambahkan baris lain, bahkan sebelum / sesudah menambahkan entri RowStyle untuk itu!

Masalah terkait lainnya yang saya hadapi adalah bahwa kontrol akan ditambahkan ke layar, tetapi mereka semua hanya diberikan pada titik 0,0 dari TableLayoutPanel, selain itu mereka bahkan tidak dibatasi untuk berada dalam batas-batas sel yang seharusnya ditampilkan dalam (yaitu dengan Dock = DockStyle.Fill mereka masih tampak terlalu besar / kecil).

Apakah seseorang memiliki contoh kerja menambahkan baris & kontrol saat runtime?


76
2017-07-17 12:07


asal


Jawaban:


Saya baru saja melakukannya minggu lalu. Mengatur GrowStyle pada TableLayoutPanel untuk AddRows atau AddColumns, maka kode Anda harus berfungsi:

// Adds "myControl" to the first column of each row
myTableLayoutPanel.Controls.Add(myControl1, 0 /* Column Index */, 0 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl2, 0 /* Column Index */, 1 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl3, 0 /* Column Index */, 2 /* Row index */);

Berikut adalah beberapa kode yang tampak serupa dengan yang Anda lakukan:

    private Int32 tlpRowCount = 0;

    private void BindAddress()
    {
        Addlabel(Addresses.Street);
        if (!String.IsNullOrEmpty(Addresses.Street2))
        {
            Addlabel(Addresses.Street2);
        }
        Addlabel(Addresses.CityStateZip);
        if (!String.IsNullOrEmpty(Account.Country))
        {
            Addlabel(Address.Country);
        }
        Addlabel(String.Empty); // Notice the empty label...
    }

    private void Addlabel(String text)
    {            
        label = new Label();
        label.Dock = DockStyle.Fill;
        label.Text = text;
        label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
        tlpAddress.Controls.Add(label, 1, tlpRowCount);
        tlpRowCount++;
    }

Itu TableLayoutPanel selalu memberi saya sesuai dengan ukuran. Dalam contoh saya di atas, saya mengajukan sebuah kartu alamat yang mungkin tumbuh atau menyusut tergantung pada akun yang memiliki alamat saluran dua, atau suatu negara. Karena baris terakhir, atau kolom, dari panel tata letak tabel akan meregang, saya membuang label kosong di sana untuk memaksa baris kosong baru, kemudian semuanya berbaris dengan baik.

Berikut adalah kode desainer sehingga Anda dapat melihat tabel yang saya mulai dengan:

        //
        // tlpAddress
        // 
        this.tlpAddress.AutoSize = true;
        this.tlpAddress.BackColor = System.Drawing.Color.Transparent;
        this.tlpAddress.ColumnCount = 2;
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 25F));
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
        this.tlpAddress.Controls.Add(this.pictureBox1, 0, 0);
        this.tlpAddress.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tlpAddress.Location = new System.Drawing.Point(0, 0);
        this.tlpAddress.Name = "tlpAddress";
        this.tlpAddress.Padding = new System.Windows.Forms.Padding(3);
        this.tlpAddress.RowCount = 2;
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.Size = new System.Drawing.Size(220, 95);
        this.tlpAddress.TabIndex = 0;

70
2018-02-02 05:58



Ini desain yang aneh, tapi TableLayoutPanel.RowCount properti tidak mencerminkan hitungan RowStyles koleksi, dan juga untuk ColumnCount properti dan ColumnStyles koleksi.

Apa yang saya temukan yang saya butuhkan dalam kode saya adalah memperbarui secara manual RowCount/ColumnCount setelah melakukan perubahan RowStyles/ColumnStyles.

Berikut ini contoh kode yang saya gunakan:

    /// <summary>
    /// Add a new row to our grid.
    /// </summary>
    /// The row should autosize to match whatever is placed within.
    /// <returns>Index of new row.</returns>
    public int AddAutoSizeRow()
    {
        Panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        Panel.RowCount = Panel.RowStyles.Count;
        mCurrentRow = Panel.RowCount - 1;
        return mCurrentRow;
    }

Pikiran lain

  • Saya tidak pernah digunakan DockStyle.Fill untuk membuat kontrol mengisi a sel di Grid; Saya telah melakukan ini dengan mengatur Anchors milik kontrol.

  • Jika Anda menambahkan banyak kontrol, pastikan Anda menelepon SuspendLayout dan ResumeLayout sekitar proses, hal-hal lain akan berjalan lambat karena seluruh formulir relaid setelah setiap kontrol ditambahkan.


28
2018-02-21 21:52



Inilah kode saya untuk menambahkan baris baru ke kolom TableLayout dua kolom:

private void AddRow(Control label, Control value)
{
    int rowIndex = AddTableRow();
    detailTable.Controls.Add(label, LabelColumnIndex, rowIndex);
    if (value != null)
    {
        detailTable.Controls.Add(value, ValueColumnIndex, rowIndex);
    }
}

private int AddTableRow()
{
    int index = detailTable.RowCount++;
    RowStyle style = new RowStyle(SizeType.AutoSize);
    detailTable.RowStyles.Add(style);
    return index;
}

Kontrol label masuk di kolom kiri dan kontrol nilai masuk di kolom kanan. Kontrol umumnya bertipe Label dan memiliki properti AutoSize yang disetel ke true.

Saya tidak berpikir itu terlalu penting, tetapi untuk referensi, berikut adalah kode desainer yang mengatur detailTable:

this.detailTable.ColumnCount = 2;
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.detailTable.Location = new System.Drawing.Point(0, 0);
this.detailTable.Name = "detailTable";
this.detailTable.RowCount = 1;
this.detailTable.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.detailTable.Size = new System.Drawing.Size(266, 436);
this.detailTable.TabIndex = 0;

Ini semua berfungsi dengan baik. Anda harus menyadari bahwa tampaknya ada beberapa masalah dengan membuang kontrol dari TableLayoutPanel secara dinamis menggunakan properti Kontrol (setidaknya dalam beberapa versi kerangka). Jika Anda perlu menghapus kontrol, saya sarankan membuang seluruh TableLayoutPanel dan membuat yang baru.


16
2018-02-18 16:02



Buat panel tata letak tabel dengan dua kolom di formulir Anda dan beri nama tlpFields.

Kemudian, cukup tambahkan kontrol baru ke panel tata letak tabel (dalam hal ini saya menambahkan 5 label di kolom-1 dan 5 kotak teks di kolom-2).

tlpFields.RowStyles.Clear();  //first you must clear rowStyles

for (int ii = 0; ii < 5; ii++)
{
    Label l1= new Label();
    TextBox t1 = new TextBox();

    l1.Text = "field : ";

    tlpFields.Controls.Add(l1, 0, ii);  // add label in column0
    tlpFields.Controls.Add(t1, 1, ii);  // add textbox in column1

    tlpFields.RowStyles.Add(new RowStyle(SizeType.Absolute,30)); // 30 is the rows space
}

Akhirnya, jalankan kodenya.


7
2017-10-02 08:52



Saya baru saja melihat kode saya. Dalam satu aplikasi, saya hanya menambahkan kontrol, tetapi tanpa menentukan indeks, dan ketika selesai, saya hanya mengulang melalui gaya baris dan mengatur jenis ukuran ke AutoSize. Jadi, tambahkan saja tanpa menentukan indeks tampaknya menambahkan baris sebagaimana dimaksud (asalkan GrowStyle diatur ke AddRows).

Di aplikasi lain, saya menghapus kontrol dan mengatur properti RowCount ke nilai yang dibutuhkan. Ini tidak menambahkan RowStyles. Lalu saya menambahkan kontrol saya, kali ini menentukan indeks, dan menambahkan RowStyle baru (RowStyles.Add(new RowStyle(...)) dan ini juga berfungsi.

Jadi, pilih salah satu metode ini, keduanya berfungsi. Saya ingat sakit kepala panel tata letak meja yang menyebabkan saya.


4
2017-07-17 12:18



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        Dim dc As DataColumn
        dc = New DataColumn("Question", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)

        dc = New DataColumn("Ans1", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans2", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans3", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans4", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("AnsType", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)


        Dim Dr As DataRow
        Dr = dt.NewRow
        Dr("Question") = "What is Your Name"
        Dr("Ans1") = "Ravi"
        Dr("Ans2") = "Mohan"
        Dr("Ans3") = "Sohan"
        Dr("Ans4") = "Gopal"
        Dr("AnsType") = "Multi"
        dt.Rows.Add(Dr)

        Dr = dt.NewRow
        Dr("Question") = "What is your father Name"
        Dr("Ans1") = "Ravi22"
        Dr("Ans2") = "Mohan2"
        Dr("Ans3") = "Sohan2"
        Dr("Ans4") = "Gopal2"
        Dr("AnsType") = "Multi"
        dt.Rows.Add(Dr)
        Panel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows
        Panel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single
        Panel1.BackColor = Color.Azure
        Panel1.RowStyles.Insert(0, New RowStyle(SizeType.Absolute, 50))
        Dim i As Integer = 0

        For Each dri As DataRow In dt.Rows



            Dim lab As New Label()
            lab.Text = dri("Question")
            lab.AutoSize = True

            Panel1.Controls.Add(lab, 0, i)


            Dim Ans1 As CheckBox
            Ans1 = New CheckBox()
            Ans1.Text = dri("Ans1")
            Panel1.Controls.Add(Ans1, 1, i)

            Dim Ans2 As RadioButton
            Ans2 = New RadioButton()
            Ans2.Text = dri("Ans2")
            Panel1.Controls.Add(Ans2, 2, i)
            i = i + 1

            'Panel1.Controls.Add(Pan)
        Next

0
2018-03-20 23:14



Ini berfungsi sempurna untuk menambahkan baris dan kontrol di TableLayoutPanel.

Tentukan Tablelayoutpanel kosong dengan 3 kolom di halaman desain

    Dim TableLayoutPanel3 As New TableLayoutPanel()

    TableLayoutPanel3.Name = "TableLayoutPanel3"

    TableLayoutPanel3.Location = New System.Drawing.Point(32, 287)

    TableLayoutPanel3.AutoSize = True

    TableLayoutPanel3.Size = New System.Drawing.Size(620, 20)

    TableLayoutPanel3.ColumnCount = 3

    TableLayoutPanel3.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single

    TableLayoutPanel3.BackColor = System.Drawing.Color.Transparent

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 26.34146!))

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 73.65854!))

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 85.0!))

    Controls.Add(TableLayoutPanel3)

Buat tombol btnAddRow untuk menambahkan baris di setiap klik

     Private Sub btnAddRow_Click(sender As System.Object, e As System.EventArgs) Handles btnAddRow.Click

          TableLayoutPanel3.GrowStyle = TableLayoutPanelGrowStyle.AddRows

          TableLayoutPanel3.RowStyles.Add(New RowStyle(SizeType.Absolute, 20))

          TableLayoutPanel3.SuspendLayout()

          TableLayoutPanel3.RowCount += 1

          Dim tb1 As New TextBox()

          Dim tb2 As New TextBox()

          Dim tb3 As New TextBox()

          TableLayoutPanel3.Controls.Add(tb1 , 0, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.Controls.Add(tb2, 1, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.Controls.Add(tb3, 2, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.ResumeLayout()

          tb1.Focus()

 End Sub

0
2017-09-30 08:30



Saya baru saja mengalami masalah terkait (yang bagaimana saya menemukan utas ini), di mana gaya baris dan kolom yang ditambahkan secara dinamis tidak berpengaruh. Saya biasanya menganggap SuspendLayout () / ResumeLayout () sebagai pengoptimalan, tetapi dalam kasus ini, membungkus kode saya di dalamnya membuat baris dan kolom berperilaku dengan benar.


0
2018-01-22 21:32