2011-04-27 35 views
0

我已經設置了一個程序,在最後一個複選框被選中時添加新行。我的問題是與自動滾動。當行通過窗口邊緣時,它會創建下一行,但它看起來像將原點設置爲上一行的起點。如何修復在基於表單的程序中移動我的起點的自動滾動?

下面是一些代碼:

private void AddRow(object sender, EventArgs e) 
    { 
     bool check = ((CheckBox)sender).Checked; 
     if (check) 
     { 
      proj[i] = new Label(); 
      proj[i].Text = "Proj #"; 
      proj[i].Width = 50; 
      proj[i].Location = new Point(10, (i * 22) + 50); 
     ... 
      split[i] = new CheckBox(); 
      split[i].Text = ""; 
      split[i].Location = new Point(430, (i * 22) + 50); 
      split[i].CheckedChanged += new EventHandler(AddRow); 
     } 
     this.Controls.Add(proj[i]); 
    } 

,這裏是一對夫婦的屏幕截圖: enter image description here

enter image description here

我怎樣才能解決這個問題呢?

回答

1

問題在於自動滾動行爲的方式。向下滾動時,自動滾動行爲實際上會遍歷所有控件,並通過調整它們的Top屬性來移動它們。這肯定會使添加另一行變得困難。兩個簡單的選項:

選項1:將每一行控件添加到其自己的面板(或者,最好創建一個包含它們的UserControl)。然後將這些面板中的每一個添加到FlowLayoutPanelGridLayoutPanel,這將爲您計算座標。

- 或 -

選項2

if (i == 0) 
    proj[i].Location = new Point(10, 50); 
else 
    proj[i].Location = new Point(10, proj[i-1].Top + 22); 

同樣,對於所有其他控件:除了使用(i * 22) + 50,使用。

第一種選擇是更好的做法,但第二種可能是更快的直接解決方案。您應該考慮使用網格控件,特別是如果行數可能很大。

+0

這很好,我使用了選項1,這是一個非常簡單的改變。非常感謝你。 – sange 2011-04-27 19:32:43

相關問題