উইনফর্মস টেবিললআউটপ্যানেল প্রোগ্রামগুলি সারি যুক্ত করে


85

আমি কিছুক্ষণের জন্য এটির সাথে লড়াই করে এসেছি এবং দেখতে পেয়েছি যে আরও অনেক লোক টেবিললাউটপ্যানেল (.NET 2.0 উইনফর্ম) এর সাথেও লড়াই করে।

সমস্যা

আমি একটি 'ফাঁকা' টেবিলআউটআউটপ্যানেল নেওয়ার চেষ্টা করছি, যার মধ্যে 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++;এটির জন্য একটি রাউস্টাইল এন্ট্রি যুক্ত করার আগে / পরেও আসলে অন্য সারি যুক্ত হয় না!

আরেকটি সম্পর্কিত সমস্যা যার সাথে আমি মুখোমুখি হচ্ছি তা হ'ল নিয়ন্ত্রণগুলি প্রদর্শনে যুক্ত করা হবে তবে তারা সকলেই কেবল টেবিললআউটপ্যানেলের পয়েন্ট 0,0 এ রেন্ডার হয়ে যায়, অতিরিক্তভাবে তারা এমনকি সেল সীমাতে থাকা সীমাবদ্ধও হয় না যেগুলি তাদের বলে মনে করা হচ্ছে is এর মধ্যে প্রদর্শিত হবে (যেমন ডক = ডক স্টাইল সহ ill তারা এখনও বড় / ছোট আকারে প্রদর্শিত হবে) পূরণ করুন।

কারও কি রানটাইমের সময় সারি ও নিয়ন্ত্রণ যুক্ত করার কোনও কাজের উদাহরণ রয়েছে?


একটি RowStyle যোগ করার পদ্ধতি আসলে RowStyles.Count বৃদ্ধি হবে ()
এদুয়ার্দো হারনান্দেজ

উত্তর:


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;

4
একটি খালি স্থানধারক সারি জন্য ধারণার জন্য ধন্যবাদ! আমার আকার দেওয়ার সমস্যাগুলি সমাধান করুন।
জেএনডাল

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প্রক্রিয়াটির চারপাশে, অন্যথায় প্রতিটি নিয়ন্ত্রণ যুক্ত হওয়ার পরে পুরো ফর্মটি সম্পর্কিত হওয়ায় জিনিসগুলি ধীরে চলবে।


4
এটি যদি কারও পক্ষে উপকারী হয় তবে আমার ক্ষেত্রে আমাকে টেবিললয়আউটপ্যানেল 1 কল করতে হয়েছিল Col যখন ফর্মটি লোড হচ্ছে।
জন

17

একটি দ্বি-কলামের টেবিল লেআউট কলামে একটি নতুন সারি যুক্ত করার জন্য আমার কোডটি এখানে:

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

লেবেল নিয়ন্ত্রণ বাম কলামে যায় এবং মান নিয়ন্ত্রণটি ডান কলামে যায়। নিয়ন্ত্রণগুলি সাধারণত লেবেল টাইপের হয় এবং তাদের অটোসাইজ সম্পত্তিটিকে সত্য হিসাবে সেট করা থাকে।

আমি মনে করি এটি খুব বেশি গুরুত্বপূর্ণ নয়, তবে রেফারেন্সের জন্য, এখানে ডিজাইনার কোড যা বিশদটি সেট করে রাখে টেবিল:

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;

এই সব ঠিক কাজ করে। আপনার সচেতন হওয়া উচিত যে নিয়ন্ত্রণযুক্ত বৈশিষ্ট্য (কমপক্ষে ফ্রেমওয়ার্কের কয়েকটি সংস্করণে) ব্যবহার করে একটি টেবিল লেআউটপ্যানেল থেকে নিয়ন্ত্রণ নিষ্পত্তি করার ক্ষেত্রে কিছু সমস্যা রয়েছে বলে মনে হচ্ছে। আপনার যদি নিয়ন্ত্রণগুলি সরানোর দরকার হয় তবে আমি পুরো টেবিললআউটপ্যানেলটি নিষ্পত্তি করে নতুন একটি তৈরি করার পরামর্শ দিচ্ছি।


এটি খুব সহায়ক ছিল। আমি খুঁজে পেয়েছি যে ডকস্টাইল.ফিল বৈশিষ্ট্যটি প্রয়োজনীয় ছিল। এছাড়াও, গণনার সাথে ভুল করা আশ্চর্যজনকভাবে সহজ! এছাড়াও, শৈলীগুলির সাথে সেট কলাম এবং সারি মাপের নোট করুন। আমি দেখতে পেলাম যে যখন রওসটিলটি অটোসাইজে সেট করা হয়েছিল, তখন টেক্সটলাইন সেটিংসে কিছু অনিচ্ছাকৃত প্রকরণ (শীর্ষ, মধ্য এবং নীচে) এটি উপস্থিত করে তোলে যে টেবিলটি কিছু অদ্ভুত উপায়ে অতিরিক্ত সারি তৈরি করছিল, কিন্তু এটি ছিল না। জিনিসটি বেশ ভালভাবে কাজ করে যখন আপনি এটি বের করে ফেলেন তবে এটি সেখানে পেয়ে বেদনাদায়ক ছিল!
জান হেটিচ

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 অ্যাক্সেস করছেন? আমি টেবিলটিআউটআপনেল তৈরি করেছি এবং এর নামটি ট্যাবক্লেআউট তবে এটি অ্যাক্সেস করার জন্য আমি আনাবলা।
মুনিম হাবিব

@MuneemHabib tabkelayout বৈশিষ্ট্য এবং পরিবর্তন যেতে সংশোধনকারীদের ব্যক্তিগত ফলে জনসাধারণের
RookieCoder

4

আমি আমার কোডটি সন্ধান করেছি। একটি অ্যাপ্লিকেশনটিতে, আমি কেবল নিয়ন্ত্রণগুলি যুক্ত করি, তবে সূচকটি নির্দিষ্ট না করেই এবং যখন হয়ে যায় তখন আমি সারি শৈলীর মধ্য দিয়ে লুপ করি এবং আকারের ধরনটি অটোসাইজে সেট করি। সুতরাং সূচকগুলি নির্দিষ্ট না করে কেবল এগুলি যুক্ত করা সারিগুলি সারণী হিসাবে যুক্ত হিসাবে মনে হচ্ছে (প্রদত্ত যে গ্রোথাইল অ্যাডরাউসে সেট করা আছে)।

অন্য অ্যাপ্লিকেশনটিতে, আমি নিয়ন্ত্রণগুলি সাফ করে দিয়ে রউকাউন্টের সম্পত্তিটিকে প্রয়োজনীয় মান হিসাবে সেট করি। এটি রো স্টাইলস যুক্ত করে না। তারপরে আমি আমার নিয়ন্ত্রণগুলি যুক্ত করব, এবার সূচকগুলি উল্লেখ করে একটি নতুন রোস্টাইল ( 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

প্রশ্নটি টেবিললআউটপ্যানেল সম্পর্কে, এই পোস্টটি ডেটা টেবিল সম্পর্কে। পোস্টটি কেবল কোডের জন্য। এটিতে বিন্দুটি কী হতে পারে তা বর্ণনা করার কোনও পাঠ্য নেই। কোডটিতে কোনও মন্তব্য নেই। সুতরাং, -1।
নিক আলেক্সেভ

0

এটি একটি টেবিললআউটপ্যানেলে সারি এবং নিয়ন্ত্রণ যুক্ত করার জন্য নিখুঁতভাবে কাজ করে।

নকশার পৃষ্ঠায় 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

আমার সবেমাত্র একটি সম্পর্কিত সমস্যা ছিল (এটি এই থ্রেডটি আমি কীভাবে পেয়েছি), যেখানে আমার গতিশীলভাবে যুক্ত সারি এবং কলামের শৈলী কার্যকর হচ্ছে না। আমি সাধারণত সাসপেন্ডলআউট () / রেজিউমেলআউট ()টিকে অপটিমাইজেশন হিসাবে বিবেচনা করি তবে এই ক্ষেত্রে আমার কোডটি তাদের মধ্যে মোড়ানো সারি এবং কলামগুলি সঠিকভাবে আচরণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.