Winforms TableLayoutPanel प्रोग्रामेटिक रूप से पंक्तियाँ जोड़ना


85

मैं इसके साथ थोड़ी देर के लिए लड़ रहा हूं, और पाया है कि कई अन्य लोग टेबललैटआउटपनेल (.net 2.0 Winforms) के साथ भी संघर्ष करते हैं।

मुसीबत

मैं एक 'रिक्त' सारणीबद्ध करने का प्रयास कर रहा हूं, जिसमें 10 कॉलम परिभाषित हैं, फिर रनटाइम पर प्रोग्रामेटिक रूप से नियंत्रण की पंक्तियों को जोड़ दें (यानी प्रति सेल एक नियंत्रण)।

किसी ने सोचा होगा कि यह उतना ही सरल होना चाहिए

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

लेकिन वह (मेरे लिए) पंक्तियों को नहीं जोड़ता है। तो शायद एक पंक्ति शैली में जोड़ना

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

लेकिन वह भी काम नहीं करता है। मैंने चारों ओर खोद लिया है और पाया है कि myTableLayoutPanel.RowCountउपयोग डिजाइन समय से चलाने के लिए समय बदलता है, इसलिए कर रहा हैmyTableLayoutPanel.RowCount++; वास्तव में इसके लिए RowStyle प्रविष्टि जोड़ने से पहले / बाद में एक और पंक्ति नहीं जुड़ती है!

एक और संबंधित मुद्दा जिसका मैं सामना कर रहा हूं, वह यह है कि नियंत्रणों को प्रदर्शन में जोड़ा जाएगा, लेकिन वे सभी टेबललायूटपैनेल के बिंदु 0,0 पर प्रदान किए जाते हैं, इसके अलावा वे सेल सीमा के भीतर होने के लिए भी विवश नहीं हैं कि उन्हें होना चाहिए था भीतर प्रदर्शित (यानी डॉक = डॉकसाइल के साथ। क्या वे अभी भी बहुत बड़े / छोटे तरीके से दिखाई देते हैं)।

क्या किसी के पास रनटाइम पर पंक्तियों और नियंत्रणों को जोड़ने का एक कार्यशील उदाहरण है?


रॉसटाइल को जोड़ने से वास्तव में रोव्सटाइल्स बढ़ जाएगा। ()
एडुआर्डो हर्नांडेज़

जवाबों:


75

मैंने पिछले हफ्ते ही ऐसा किया था। सेट GrowStyleपर TableLayoutPanelकरने के लिए AddRowsया AddColumns, फिर अपने कोड काम करना चाहिए:

// 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 */);

यहाँ कुछ काम कोड है जो आप क्या कर रहे हैं के समान लगता है:

    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++;
    }

TableLayoutPanelमुझे हमेशा आकार के साथ फिट बैठता है देता है। ऊपर मेरे उदाहरण में, मैं एक पता कार्ड दाखिल कर रहा हूं जो कि पता पंक्ति दो या एक देश के खाते के आधार पर बढ़ या सिकुड़ सकता है। क्योंकि टेबल लेआउट पैनल की आखिरी पंक्ति, या कॉलम में खिंचाव होगा, इसलिए मैं खाली लेबल को एक नई खाली पंक्ति को बाध्य करने के लिए वहां फेंक देता हूं, फिर सब कुछ अच्छी तरह से लाइन में आ जाता है।

यहाँ डिज़ाइनर कोड है जिससे आप मेरे साथ शुरू होने वाली तालिका देख सकते हैं:

        //
        // 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;

2
बिल्कुल सही, सरल उदाहरण।
रैंडमइन्सानो

2
खाली प्लेसहोल्डर पंक्ति के लिए विचार के लिए धन्यवाद! मेरे आकार के मुद्दों को हल किया।
JNadal

30

यह एक अजीब डिजाइन है, लेकिन TableLayoutPanel.RowCountसंपत्ति RowStylesसंग्रह की गिनती को प्रतिबिंबित नहीं करती है , और इसी तरह ColumnCountसंपत्ति और ColumnStylesसंग्रह के लिए।

क्या मैंने पाया कि मैं अपने कोड में आवश्यक मैन्युअल रूप से अद्यतन करने के लिए था RowCount/ ColumnCountकरने के लिए परिवर्तन करने के बाद RowStyles/ ColumnStyles

यहाँ कोड का एक उदाहरण मैंने उपयोग किया है:

    /// <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;
    }

अन्य विचार

  • मैंने ग्रिड में DockStyle.Fillएक सेल भरने के लिए कभी भी नियंत्रण नहीं किया है ; मैंने Anchorsनियंत्रण की संपत्ति सेट करके ऐसा किया है ।

  • यदि आप बहुत सारे नियंत्रण जोड़ रहे हैं, तो सुनिश्चित करें कि आप कॉल करते हैं SuspendLayoutऔर ResumeLayoutप्रक्रिया के आसपास, बाकी चीजें धीमी गति से चलेंगी क्योंकि प्रत्येक नियंत्रण को जोड़ने के बाद पूरे फॉर्म को फिर से जारी किया जाता है।


2
यदि यह किसी के लिए उपयोगी है, तो मेरे मामले में मुझे tableLayoutPanel1.ColumnStyles.Clear () कॉल करना था ; जब फॉर्म लोड हो रहा हो।
जॉन

17

यहां एक दो-पंक्ति TableLayoutColumn में एक नई पंक्ति जोड़ने के लिए मेरा कोड दिया गया है:

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;
}

लेबल नियंत्रण बाएं कॉलम में जाता है और मूल्य नियंत्रण दाएं कॉलम में जाता है। नियंत्रण आम तौर पर टाइप लेबल के होते हैं और उनकी AutoSize संपत्ति सही पर सेट होती है।

मुझे नहीं लगता कि यह बहुत ज्यादा मायने रखता है, लेकिन संदर्भ के लिए, यहाँ डिज़ाइनर कोड है जो विवरण सेट करता है:

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;

यह सब ठीक काम करता है। आपको पता होना चाहिए कि नियंत्रण गुण (कम से कम फ्रेमवर्क के कुछ संस्करणों में) का उपयोग करके गतिशील रूप से TableLayoutPanel से नियंत्रणों के निपटान में कुछ समस्याएं दिखाई देती हैं। यदि आपको नियंत्रण हटाने की आवश्यकता है, तो मेरा सुझाव है कि संपूर्ण TableLayoutPanel का निपटान करें और एक नया बनाएं।


यह बहुत मददगार था। मैंने पाया कि DockStyle.Fill विशेषता आवश्यक थी। साथ ही, गिनती के साथ गलतियाँ करना आश्चर्यजनक रूप से आसान है! इसके अलावा, शैलियों के साथ सेट किए गए कॉलम और पंक्ति आकार पर ध्यान दें। मैंने पाया कि जब रोवसटाइल को ऑटोसाइज़ के लिए सेट किया गया था, तो TextAlign सेटिंग्स (टॉप, मिडल, और बॉटम के बीच) में कुछ अनजाने बदलावों ने यह दिखा दिया कि टेबल कुछ अजीब तरीके से अतिरिक्त पंक्तियों को उत्पन्न कर रहा था, लेकिन ऐसा नहीं था। एक बार जब आप इसका पता लगा लेते हैं तो यह काम बहुत अच्छा हो जाता है, लेकिन यह दर्दनाक था।
जान हेटिच

7

अपने फॉर्म में दो कॉलम के साथ एक टेबल लेआउट पैनल बनाएं और इसे नाम दें tlpFields

फिर, टेबल लेआउट पैनल में नया नियंत्रण जोड़ें (इस मामले में मैंने कॉलम -1 में 5 लेबल और कॉलम -2 में 5 टेक्स्टबॉक्स जोड़े)।

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
}

अंत में, कोड चलाएँ।


आप tlpfields पर कैसे पहुंच रहे हैं? मैंने टेबलेउंटपैनल बनाया है और इसका नाम टैबकेलिएउट है लेकिन मैं इसे एक्सेस करने के लिए अनबला हूं।
मुनीम हबीब

@ मुनीमहैब टैबकलेयूट गुणों में जाते हैं और निजी से सार्वजनिक रूप से संशोधक बदलते हैं
रूकी कोडर

4

मैंने सिर्फ अपने कोड में देखा। एक आवेदन में, मैं सिर्फ नियंत्रण जोड़ता हूं, लेकिन सूचकांक को निर्दिष्ट किए बिना, और जब किया जाता है, तो मैं केवल पंक्ति शैलियों के माध्यम से लूप करता हूं और आकार प्रकार को AutoSize पर सेट करता हूं। तो केवल सूचकांकों को निर्दिष्ट किए बिना उन्हें जोड़ना उन पंक्तियों को जोड़ने के लिए प्रतीत होता है (बशर्ते कि ग्रोथस्टाइल AddRows पर सेट हो)।

एक अन्य एप्लिकेशन में, मैं नियंत्रण को साफ़ करता हूं और आवश्यक मूल्य के लिए RowCount संपत्ति सेट करता हूं। यह RowStyles नहीं जोड़ता है। फिर मैं अपने नियंत्रणों को जोड़ता हूं, इस बार सूचकांकों को निर्दिष्ट करता हूं, और एक नया रॉसटाइल ( RowStyles.Add(new RowStyle(...)) जोड़ता हूं और यह भी काम करता है।

तो, इनमें से कोई एक तरीका चुनिए, ये दोनों काम करते हैं। मुझे याद है कि टेबल लेआउट पैनल के कारण मुझे सिरदर्द होता है।


मैं इन लोगों को यह देखने की कोशिश करूँगा कि क्या यह स्वयं व्यवहार करता है!
ऐश

0
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

सवाल TableLayoutPanel के बारे में है, यह पोस्ट DataTable के बारे में है। पोस्ट कोड-ओनली है। इसमें ऐसा कोई पाठ नहीं है जो यह बता सके कि बिंदु क्या हो सकता है। कोड में कोई टिप्पणी नहीं। Số 1।
निक एलेक्सिव

0

यह TableLayoutPanel में पंक्तियों और नियंत्रणों को जोड़ने के लिए पूरी तरह से काम करता है।

डिज़ाइन पृष्ठ में 3 कॉलमों के साथ एक खाली टेबल-आउट पैनल को परिभाषित करें

    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)

प्रत्येक क्लिक पर पंक्तियाँ जोड़ने के लिए एक बटन btnAddRow बनाएँ

     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

मुझे सिर्फ एक संबंधित समस्या थी (जो है कि मुझे यह धागा कैसे मिला), जहां मेरी गतिशील रूप से जोड़ी गई पंक्ति और स्तंभ शैली प्रभावी नहीं थीं। मैं आमतौर पर SuspendLayout () / ResumeLayout () को अनुकूलन के रूप में मानता हूं, लेकिन इस मामले में, मेरे कोड को उनमें लपेटने से पंक्तियों और स्तंभों का सही तरीके से व्यवहार होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.