2015-01-05 85 views
-1

我已經做了一個用戶控件,其中包含2個簡單的控件:複選框和組合框。 (和它的一些副本,其中包含一個複選框和一個文本框,或一個複選框和IBAN控制vs ...)如何動態設置用戶控件的內部控件的大小

當我在設計者模式下使用此用戶控件時,更改用戶控件的大小不會更改內部控制的大小自然而然。我必須在頁面中設置它們的大小,我在實際的類中使用用戶控件,但在設計器類中。我的目標是通過改變用戶控件的寬度來改變這些控件的寬度。我的意思是:

讓我們打電話給我們的控制ucControl,其內部控件cbCheckBox和cmbComboBox。創建此用戶控件時,我爲所有這些控件設置了一個靜態大小,除了大小ucControl之外,其餘大小不適用於從設計器更改大小。

我想cmbComboBox的大小改變時的ucControl的大小而變化,根據就像一個公式:

cmbComboBox.Size = new Size(ucControl.Size.Width - cbCheckBox.Size.Width - 15, 20)

如何,我應該在哪裏呢?

我試過到目前爲止:

我試圖用SizeChanged事件,但沒有奏效。 (它不讓我在用戶控件中創建一個void returns事件方法,不知道爲什麼。)

我試圖在load方法中設置它,但它不起作用。

我試圖在設計類的InitializeComponent方法中設置它,但它沒有工作。

+2

錨定這些子控件。 – LarsTech

+0

它在用戶控件的設計器中工作,但不是以我使用該用戶控件的形式工作。 –

+0

忘記錨..使用容器:) – Darek

回答

1

解決此問題的最佳方法是使用容器並使用控件Dock填充選項。這樣它會爲你動態調整大小。你也可以將它錨定到左側和右側,但是我發現容器是更優雅的選擇。下面的示例使用了一個簡單的TableLayoutPanel,並修復了一些行和列。

enter image description here

partial class Form1 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); 
     this.label1 = new System.Windows.Forms.Label(); 
     this.checkBox1 = new System.Windows.Forms.CheckBox(); 
     this.label2 = new System.Windows.Forms.Label(); 
     this.textBox1 = new System.Windows.Forms.TextBox(); 
     this.tableLayoutPanel1.SuspendLayout(); 
     this.SuspendLayout(); 
     // 
     // tableLayoutPanel1 
     // 
     this.tableLayoutPanel1.ColumnCount = 2; 
     this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F)); 
     this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
     this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1); 
     this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); 
     this.tableLayoutPanel1.Controls.Add(this.checkBox1, 1, 0); 
     this.tableLayoutPanel1.Controls.Add(this.textBox1, 1, 1); 
     this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); 
     this.tableLayoutPanel1.Name = "tableLayoutPanel1"; 
     this.tableLayoutPanel1.RowCount = 3; 
     this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); 
     this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); 
     this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); 
     this.tableLayoutPanel1.Size = new System.Drawing.Size(412, 198); 
     this.tableLayoutPanel1.TabIndex = 0; 
     // 
     // label1 
     // 
     this.label1.AutoSize = true; 
     this.label1.Dock = System.Windows.Forms.DockStyle.Right; 
     this.label1.Location = new System.Drawing.Point(62, 3); 
     this.label1.Margin = new System.Windows.Forms.Padding(3); 
     this.label1.Name = "label1"; 
     this.label1.Size = new System.Drawing.Size(55, 20); 
     this.label1.TabIndex = 0; 
     this.label1.Text = "Checkbox"; 
     // 
     // checkBox1 
     // 
     this.checkBox1.AutoSize = true; 
     this.checkBox1.Dock = System.Windows.Forms.DockStyle.Left; 
     this.checkBox1.Location = new System.Drawing.Point(123, 3); 
     this.checkBox1.Name = "checkBox1"; 
     this.checkBox1.Size = new System.Drawing.Size(80, 20); 
     this.checkBox1.TabIndex = 1; 
     this.checkBox1.Text = "checkBox1"; 
     this.checkBox1.UseVisualStyleBackColor = true; 
     // 
     // label2 
     // 
     this.label2.AutoSize = true; 
     this.label2.Dock = System.Windows.Forms.DockStyle.Right; 
     this.label2.Location = new System.Drawing.Point(71, 29); 
     this.label2.Margin = new System.Windows.Forms.Padding(3); 
     this.label2.Name = "label2"; 
     this.label2.Size = new System.Drawing.Size(46, 20); 
     this.label2.TabIndex = 2; 
     this.label2.Text = "TextBox"; 
     // 
     // textBox1 
     // 
     this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.textBox1.Location = new System.Drawing.Point(123, 29); 
     this.textBox1.Name = "textBox1"; 
     this.textBox1.Size = new System.Drawing.Size(286, 20); 
     this.textBox1.TabIndex = 3; 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(412, 198); 
     this.Controls.Add(this.tableLayoutPanel1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.tableLayoutPanel1.ResumeLayout(false); 
     this.tableLayoutPanel1.PerformLayout(); 
     this.ResumeLayout(false); 

    } 

    #endregion 

    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; 
    private System.Windows.Forms.Label label2; 
    private System.Windows.Forms.Label label1; 
    private System.Windows.Forms.CheckBox checkBox1; 
    private System.Windows.Forms.TextBox textBox1; 
} 
1

簡單地固定組合框的左側和右側應達到你想要什麼。

這裏是用戶控件後,右邊的組合框添加到它:

ComboBox in the UserControl

選擇組合框並拖動其右邊緣,直到它從用戶控件的右邊緣所需的距離:

ComboBox resized so that it fills the width of the UserControl

更改組合框的錨定屬性並打開右側錨點,以便打開左側和右側:

ComboBox with Left and Right Anchor turned on

現在嘗試調整大小UserControl和看看會發生什麼到ComboBox。

+0

它在用戶控件本身的設計器中調整用戶控件大小時起作用,但不是以我使用它的形式調整大小。 –

+0

最有可能的是,你沒有UserControl本身的設置,它會被Form調整大小。它也需要停靠或錨定,以便調整大小(或者需要配置表單中的其他容器)。 –

相關問題