7

インターネットでこれを検索しましたが、C#でそれを行う方法が見つかりませんでした

私がやろうとしているのは、NewTabボタンをクリックすると、最初のタブと同じコントロールで新しいタブが表示されるようにすることです。フォームにを追加する方法についていくつかの情報を見ましたUserControlが、C#にはそのようなものはありません。

そして、「あなたのコードを投稿してください」と言うすべての人にとって、私は何も持っていないので、私が持っている唯一のコードはプログラムのコードであり、それは誰にも役立ちません。

4

3 に答える 3

9

編集

リフレクションを使用するようにソリューションを書き直しました。

using System.Reflection;

// your TabControl will be defined in your designer
TabControl tc;
// as will your original TabPage
TabPage tpOld = tc.SelectedTab;

TabPage tpNew = new TabPage();
foreach(Control c in tpOld.Controls)
{
    Control cNew = (Control) Activator.CreateInstance(c.GetType());

    PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(c);

    foreach (PropertyDescriptor entry in pdc)
    {
        object val = entry.GetValue(c);
        entry.SetValue(cNew, val);
    }

    // add control to new TabPage
    tpNew.Controls.Add(cNew);
}

tc.TabPages.Add(tpNew);

いくつかの情報はここにあります。 http://www.codeproject.com/Articles/12976/How-to-Clone-Serialize-Copy-Paste-a-Windows-Forms

于 2013-01-24T17:35:19.190 に答える
1

あなたの最善の策は、この記事を見ることです:

コードプロジェクト

次に、次のコードを適用して、複製されたコントロールを追加します(これは、ボタンクリックハンドラーコード(記事に基づく)に含まれます:

    private void button1_Click(object sender, EventArgs e)
    {
        // create new tab
        TabPage tp = new TabPage();

        // iterate through each control and clone it
        foreach (Control c in this.tabControl1.TabPages[0].Controls)
        {
            // clone control (this references the code project download ControlFactory.cs)
            Control ctrl = CtrlCloneTst.ControlFactory.CloneCtrl(c);
            // now add it to the new tab
            tp.Controls.Add(ctrl);
            // set bounds to size and position
            ctrl.SetBounds(c.Bounds.X, c.Bounds.Y, c.Bounds.Width, c.Bounds.Height);
        }

        // now add tab page
        this.tabControl1.TabPages.Add(tp);
    }

次に、イベントハンドラーを接続する必要があります。これについて考える必要があります。

于 2013-01-24T17:53:48.043 に答える
1

私はそれが古いスレッドであることを知っていますが、私は自分自身のための方法を考え出し、それを共有すべきだと思いました。これは本当にシンプルで、.Net4.6でテストされています。

このソリューションは実際には新しいコントロールを作成せず、すべてを新しいTabPageに再割り当てするだけなので、タブを変更するたびにAddRangeを使用する必要があることに注意してください。[新しい]タブには、含まれているまったく同じコントロール、コンテンツ、値が表示されます。

// Create an array and copy controls from first tab to it.
Array tabLayout = new Control [numberOfControls];
YourTabControl.TabPages[0].Controls.CopyTo(tabLayout, 0);

// AddRange each time you change a tab.
YourTabControl.TabPages[newTabIndex].Controls.AddRange((Control[])tabLayout);
于 2017-03-20T10:14:19.867 に答える