0

C# と Windows フォームを使用してこれが可能かどうかは完全にはわかりませんが、次のようになります。

ウィンドウを 2 つに分割したい。左側には、縦に並べられた一連のボタンがあります。

各ボタンをクリックすると、右側のものを変更する必要があります。ボタンのクリックごとに異なるコントロールを表示したい。

(Web ブラウザーのタブのようなもので、上部ではなく左側のペインにあります)

分割コンテナーを使用する必要があると思いますが、私が見た分割コンテナーのチュートリアルのほとんどは、右側の同じコントロールを使用しており、何かがクリックされるたびに異なるデータが表示されます。

必要なものが明確になっていることを願っています。どんな助けや指針も大歓迎です。

4

3 に答える 3

0

必要な正確なレイアウトとコントロールはあなた次第です。

1) splitcontainer をフォームに追加します。

2) splitcontainer の左側のパネルに flowLayoutPanel を追加し、親コンテナーにドッキングします。

3) 垂直レイアウトを要求したため、flowLayoutPanel の FlowDirection をトップダウンに設定しました

4)私の例では、6つのボタンを使用し、それらに名前を付けました(代わりにテキストにすることもできます)btncontrol1、2、3 ...など、同じことを行います。

5) すべてのボタン クリック ハンドラーを同じに設定します (この場合は buttons_Click)

6) このコードをコピーして貼り付けます

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttons_Click(object sender, EventArgs e)
        {
            Button b = sender as Button;

            switch (b.Name)
            {
                //of course after each ClearPanel what i do is only for
                //demonstration.
                case "btnControl1":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new ListBox());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                case "btnControl2":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new RadioButton());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                case "btnControl3":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new Button());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                case "btnControl4":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new DateTimePicker());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                case "btnControl5":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new DataGridView());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                case "btnControl6":
                    splitContainer1.Panel2.SuspendLayout();
                    ClearPanel();
                    splitContainer1.Panel2.Controls.Add(new TextBox());
                    splitContainer1.Panel2.ResumeLayout();
                    break;
                default:
                    break;
            }
        }

        private void ClearPanel()
        {
            if (splitContainer1.Panel2.HasChildren)
            {
                foreach (Control c in splitContainer1.Panel2.Controls)
                {
                    c.Dispose();
                }
                splitContainer1.Panel2.Controls.Clear();
            }
        }
    }

それがあなたを助けることを願っています。

于 2013-11-07T17:39:29.873 に答える
0

1 つの方法として、右側のインターフェイスごとに新しいユーザー コントロールを作成することができます。ボタンをクリックすると、これらのコントロールのいずれかの新しいインスタンスを右側のパネルにロードできます。

if (splitContainer.Panel2.Controls.Count > 0)
{
    splitContainer.Panel2.Controls[0].Dispose();    // Edit
    splitContainer.Panel2.Controls.Clear();
}

splitContainer.Panel2.Controls.Add(new RightHandControl());

これは、過去に試したときにうまくいくようです。

編集:コメントで指摘されているように、この例では、クリア時にユーザー コントロールが適切に破棄されません。これを解決するにDispose()は、リストをクリアする前に呼び出します。

于 2013-11-07T16:42:00.937 に答える
0

MSDNTabControlで説明されているように、 で仕事を終わらせることができます。タブを右側に配置する方法の例を示していますが、「右」と「左」を切り替えると、求める動作が得られるはずです。

私はWinFormsアプリで試してみましたが、例で使用されている醜い色にもかかわらず、うまく動作しているようです.以下は実装に約30秒かかります.

リンクから引用:

タブを右揃えで表示するには

  1. フォームに TabControl を追加します。
  2. 配置プロパティを右に設定します。Left に設定すると、問題なく左に進みます
  3. すべてのタブが同じ幅になるように、SizeMode プロパティを Fixed に設定します。
  4. ItemSize プロパティをタブの適切な固定サイズに設定します。タブは右揃えですが、ItemSize プロパティはタブが上にあるかのように動作することに注意してください。その結果、タブの幅を広げるには Height プロパティを変更する必要があり、タブの高さを高くするには Width プロパティを変更する必要があります。
  5. DrawMode プロパティを OwnerDrawFixed に設定します。
  6. テキストを左から右にレンダリングする TabControl の DrawItem イベントのハンドラーを定義します。

これがコードです (MSDN では VB しか表示されないため、C# に変換されています)。

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    Graphics g = e.Graphics;
    Brush _TextBrush = default(Brush);

    // Get the item from the collection. 
    TabPage _TabPage = tabControl1.TabPages[e.Index];

    // Get the real bounds for the tab rectangle. 
    Rectangle _TabBounds = tabControl1.GetTabRect(e.Index);

    if ((e.State == DrawItemState.Selected))
    {
        // Draw a different background color, and don't paint a focus rectangle.
        _TextBrush = new SolidBrush(Color.Red);
        g.FillRectangle(Brushes.Gray, e.Bounds);
    }
    else
    {
        _TextBrush = new System.Drawing.SolidBrush(e.ForeColor);
        e.DrawBackground();
    }

    // Use our own font. 
    Font _TabFont = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Pixel);

    // Draw string. Center the text. 
    StringFormat _StringFlags = new StringFormat();
    _StringFlags.Alignment = StringAlignment.Center;
    _StringFlags.LineAlignment = StringAlignment.Center;
    g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, new StringFormat(_StringFlags));
}

コンテンツを TabControl に入れるだけで、(ちょっと) 準備完了です。

于 2013-11-07T16:44:55.620 に答える