2012-08-16 89 views
0

後,我試圖讓能夠容納字符串變量量,並調整它通過編程方式更改此控件的高度是高度動態控制。重新調整項目計劃調整大小

到目前爲止,我已經嘗試了經過ListBox和ListView控件。

列表框一直顯示一個水平滾動條,即使它已經被設置爲false。 ListView控件看起來更有前途,但它拒絕重新調整在框中的項目:

public partial class Form1 : Form 
{ 
    string[] content = 
     { 
      "Lorem", 
      "ipsum", 
      "dolor", 
      "sit", 
      "amet", 
      "consectetur", 
      "adipiscing", 
      "elit" , 
      "Integer" , 
      "commodo" , 
     }; 

    ListView listView1 = new ListView(); 

    public Form1() 
    { 
     InitializeComponent(); 

     listView1.Size = new System.Drawing.Size(300, 22); 
     listView1.Font = new Font(FontFamily.GenericMonospace, 10); 
     listView1.CheckBoxes = true; 
     listView1.View = View.List; 
     listView1.Scrollable = false; 

     this.Controls.Add(listView1); 

     groupBox1.Controls.Add(listView1); 

     foreach (string str in content) 
     { 
      listView1.Items.Add(str.PadRight(12)); 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     listView1.Height = 100; 
    } 
} 

如果我移動listView1.Height = 100;在類的構造函數會工作,所以顯然這就是問題所在。我似乎無法找到這個問題的根源是什麼......我應該調用列表框的某個成員函數來重新放置它的項目嗎?

更新 擺弄經過一些似乎行爲可以通過使用設計器將項目添加到列表中,將所有的主播也轉載,捕捉到形式的邊緣並在運行時調整形式。然後,再次,這些項目不會重新調整。仍然堅持如何強制重新定位列表視圖中的項目。

+0

負載事件是否正在觸發?如果是這樣你嘗試listView1.Refresh()? – Belmiris 2012-08-16 13:56:36

+0

@Belmiris是的,但問題不在於listview沒有調整大小;它是完美的。列表視圖中的項目保持原樣:單行和控件外部。如果你能找到時間,只需將上面的代碼粘貼到一個空白的窗體項目中,你就會明白我的意思了。 – Nebula 2012-08-16 14:03:36

+0

找不到解決方案 - 但使用不同的視圖設置(如SmallIcon)不存在此問題。只是不要設置ImageList。 – 2012-08-16 20:10:33

回答

1

只有現在我意識到我的答案真的在做什麼。我基本上使用文本的附加標籤重新實現了複選框。對...

解決方案 我的解決方案最終歸結爲流程佈局面板中的幾個複選框。

0

經過一些調查,並提供給我的意見,我用下降標準控件的想法。這裏的原因:

  • CheckedListBox:具有這樣當控件的大小以編程方式更改滾動條重新出現的錯誤。
  • 的ListView列表模式:不能重新排列圖標時,過去式的構造。
  • 的ListView在SmallIcon模式:有一個地方的第一列控制之外的ceckbox的錯誤。

所以我決定使用這兩個來源,使我自己的控制:

我自己做了一個CheckedLabel:

設計師

#region Component 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.cbCheckbox = new System.Windows.Forms.CheckBox(); 
    this.lblDisplay = new System.Windows.Forms.Label(); 
    this.SuspendLayout(); 
    // 
    // cbCheckbox 
    // 
    this.cbCheckbox.AutoSize = true; 
    this.cbCheckbox.Location = new System.Drawing.Point(3, 3); 
    this.cbCheckbox.Name = "cbCheckbox"; 
    this.cbCheckbox.Size = new System.Drawing.Size(15, 14); 
    this.cbCheckbox.TabIndex = 0; 
    this.cbCheckbox.UseVisualStyleBackColor = true; 
    this.cbCheckbox.CheckedChanged += new System.EventHandler(this.cbCheckbox_CheckedChanged); 
    // 
    // lblDisplay 
    // 
    this.lblDisplay.AutoSize = true; 
    this.lblDisplay.Location = new System.Drawing.Point(24, 4); 
    this.lblDisplay.Name = "lblDisplay"; 
    this.lblDisplay.Size = new System.Drawing.Size(35, 13); 
    this.lblDisplay.TabIndex = 1; 
    this.lblDisplay.Text = "label1"; 
    // 
    // CheckedLabel 
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.AutoSize = true; 
    this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
    this.Controls.Add(this.lblDisplay); 
    this.Controls.Add(this.cbCheckbox); 
    this.Name = "CheckedLabel"; 
    this.Size = new System.Drawing.Size(62, 20); 
    this.ResumeLayout(false); 
    this.PerformLayout(); 

} 

#endregion 

實施

[System.ComponentModel.DefaultEvent("CheckedChanged")] 
public partial class CheckedLabel : UserControl 
{ 
    public event EventHandler CheckedChanged; 

    public CheckedLabel() 
    { 
     InitializeComponent(); 
    } 

    public override string Text 
    { 
     get 
     { 
      return lblDisplay.Text; 
     } 

     set 
     { 
      lblDisplay.Text = value; 
     } 
    } 


    private void cbCheckbox_CheckedChanged(object sender, EventArgs e) 
    { 
     // Pass the checkbox event as an ultra-shallow copy 
     CheckBox b = new CheckBox(); 
     b.Checked = cbCheckbox.Checked; 
     b.Text = lblDisplay.Text; 

     CheckedChanged(b, e); 
    }   
} 

而且這些控件添加到面板的FlowLayout。這種設置實際上允許我按照自己的喜好增長和縮小容器,同時自動重新調整CheckedLabels以提供最佳配合。