2013-04-24 25 views
2

我在一個較大的面板內有2個面板。 2個內部面板自動調整大小,外部面板自動滾動,以便我可以向下滾動2個面板的內容。面板在向下滾動時丟失內容

我使用繪畫事件在右側面板上繪製網格線,並且兩者都有標籤控件。

這一切工作正常(也調整大小和響應),但當我滾動下來一些奇怪的事情發生。

所以說我稱之爲當你的滾動條處於最初狀態時看到的東西。然後,當我向下滾動,沒有任何的初始狀態是可見的,我調整/最小化/刷新...我的右側面板(與網格線和標籤)灰色,一切都消失。

只有當我再次向上滾動並打到初始狀態的底部時,標籤和圖形纔會回來。

我知道這可能很難理解,但如果您認爲自己能夠提供幫助,可以隨時要求澄清任何事情。

The initial state

After scrolling down and resizing/minimize - restoring... 向下滾動和縮放/最小化後的初始狀態 - 恢復......當我到了一些東西,是在初始狀態

Everything appears again when I reach something which was in the initial state

一切再次出現

右側面板的繪畫事件(雖然我懷疑它會有很多用途)

private void panelPlanning_Paint(object sender, PaintEventArgs e) 
    { 
     for (int i = 0; i <= sub.Days + 1; i++) 
     { 
      if (toolStripButtonGrid.CheckState == CheckState.Checked) 
      { 
       if (vertGrid) 
       { 
        if (dashedVert) 
        { 
         Pen blackPen = new Pen(Color.FromArgb(50, 0, 0, 0), 1); 
         blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; 

         e.Graphics.DrawLine(blackPen, i * labelDaysWidth, 0, i * labelDaysWidth, panelPlanning.Height); 
        } 
        else 
        { 
         Pen blackPen = new Pen(Color.FromArgb(50, 0, 0, 0), 1); 
         e.Graphics.DrawLine(blackPen, i * labelDaysWidth, 0, i * labelDaysWidth, panelPlanning.Height); 
        } 
       } 
      } 
     } 

     for (int i = 0; i < userList.Count; i++) 
     { 
      if (horGrid && toolStripButtonGrid.CheckState == CheckState.Checked) 
      { 
       if (dashedHor) 
       { 
        Pen blackPen = new Pen(Color.FromArgb(50, 0, 0, 0), 1); 
        blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; 

        e.Graphics.DrawLine(blackPen, 0, i * userHeight, panelPlanning.Width, i * userHeight); 
       } 
       else 
       { 
        Pen blackPen = new Pen(Color.FromArgb(50, 0, 0, 0), 1); 
        e.Graphics.DrawLine(blackPen, 0, i * userHeight, panelPlanning.Width, i * userHeight); 
       } 
      } 
     } 

     for (int i = 0; i <= sub.Days + 1; i++) 
     { 
      if (dtPickerStart.Value.AddDays(i) == DateTime.Today) 
      { 
       Pen blackpen = new Pen(Color.Black, 3); 
       e.Graphics.DrawLine(blackpen, i * labelDaysWidth + labelDaysWidth/2, 0, i * labelDaysWidth + labelDaysWidth/2, panelPlanning.Height); 
      } 
     } 

     if (userList.Count > 0) 
     { 
      panelPlanning.Height = userList.Count * userHeight; 
      panelUsers.Height = userList.Count * userHeight; 
     } 
     if (nrResources == 0) 
     { 
      nrResources = 10; 
     } 
     userHeight = panel1.Height/nrResources; 
    } 

編輯

https://www.dropbox.com/sh/p4k9zilmy5pq6ev/RpBEe05B3j

一個歸結的解決方案,使得同樣的問題的版本。

EDIT 2

我已經能夠解決大部分的問題。下面是一些代碼,我改變了(看看我改變了你可以看到上面的Dropbox的鏈接比較。

private void this_beginResize(object sender, EventArgs e) 
{ 
    this.ResizeBegin -= new EventHandler(this_beginResize); 

    panelPlanning.Paint -= new PaintEventHandler(panelPlanning_Paint); 

    this.SuspendLayout(); 
    SuspendDrawing(panelTimeline); 
    SuspendDrawing(panelPipeLine); 
    SuspendDrawing(panel1); 
} 

我用來去除ResizeEnd事件,稍後再添加它。我改變了進ResizeBegin,因爲這使得我更有意義。

private void this_SizeChanged(object sender, EventArgs e) 
{ 
    panelTimeline.Controls.Clear(); 
    sub = dtPickerEnd.Value - dtPickerStart.Value; 
    addDayLabels(sub); 

    panelUsers.Controls.Clear(); 
    addUserLabels(); 

    panelPlanning.Paint += new PaintEventHandler(panelPlanning_Paint); 

    ResumeDrawing(panel1); 
    ResumeDrawing(panelTimeline); 
    ResumeDrawing(panelPipeLine); 
    this.ResumeLayout(); 

    if (userList.Count > 0) 
    { 
     panelPlanning.Height = userList.Count * userHeight; 
     panelUsers.Height = userList.Count * userHeight; 
    } 
    if (nrResources == 0) 
    { 
     nrResources = 10; 
    } 
    userHeight = panel1.Height/nrResources; 
    lastPanelHeight = panel1.Height; 

    panelPlanning.Controls.Clear(); 
    addPlanning(); 

    this.ResizeBegin += new EventHandler(this_beginResize); 
} 

當調整大小爲我所用,使規劃面板容器面板的高度結束。這可能是主要的原因,當我向下滾動我的內容丟失。 我用我繪畫事件中的代碼替換了這個來計算高度,我還分配了一個變量lastPanelHeight,它保持tr下面方法的面板高度的確認。 最大化和恢復事件在它們被實際執行之前在這裏被調用,所以我需要知道它們必須被恢復到什麼地步。

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0112) // WM_SYSCOMMAND 
    { 
     // Check your window state here 
     if (m.WParam == new IntPtr(0xF030) || m.WParam == new IntPtr(0xF120)) // Maximize event - SC_MAXIMIZE from Winuser.h 
     { 
      //Same code as the two above combined but with lastPanelHeight as value to do the calculations with 
     } 
    } 
    base.WndProc(ref m); 
} 

無論其,我仍然遇到問題。當我調整大小和窗體變大或我從最大化或最小化狀態恢復窗口時,滾動條以一種奇怪的方式起作用。 當它一直向下並且表格變得更大時,它將停留在面板的相同高度,從而向上移動。 在恢復時,滾動條總是回到頂部。 任何想法?

+0

歡迎使用截圖和一些代碼。 – 2013-04-24 11:09:08

+0

我會嘗試發佈一些截圖。你想看哪個代碼?網格線的Paint事件? – 2013-04-24 11:09:47

+0

您認爲相關的任何代碼。當你向下滾動一下時,你描述的是否會發生? – 2013-04-24 11:12:31

回答

1

經過初步改進(請參閱EDIT2問題)後,我專注於滾動條,並在一段時間後讓它工作。技巧是在調整大小之前跟蹤滾動條值和麪板高度,並在調整大小之後用新高度計算它。滾動位置是這樣設置的,但滾動條仍然會顯示在另一個位置。這可以通過啓用和禁用滾動條來解決。下面是完整的代碼(介意代碼最大化和恢復)。

/// The beginning of a form resize 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void this_beginResize(object sender, EventArgs e) 
{ 
    lastLocation = this.Location; 
    this.ResizeBegin -= new EventHandler(this_beginResize); 

    panelPlanning.Paint -= new PaintEventHandler(panelPlanning_Paint); 
    scrollvalue = panel1.VerticalScroll.Value; 
    lastHeight = panel1.Height; 

    this.SuspendLayout(); 
    SuspendDrawing(panelTimeline); 
    SuspendDrawing(panelPipeLine); 
    SuspendDrawing(panel1); 
} 

/// <summary> 
/// Called when the form is done resizing 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void this_SizeChanged(object sender, EventArgs e) 
{ 
    if (this.Location != lastLocation) 
    { 
     lastLocation = this.Location; 
     return; 
    } 

    panelTimeline.Controls.Clear(); 
    sub = dtPickerEnd.Value - dtPickerStart.Value; 
    addDayLabels(sub); 

    panelUsers.Controls.Clear(); 
    addUserLabels(); 

    panelPlanning.Paint += new PaintEventHandler(panelPlanning_Paint); 

    ResumeDrawing(panel1); 
    ResumeDrawing(panelTimeline); 
    ResumeDrawing(panelPipeLine); 
    this.ResumeLayout(); 

    if (userList.Count > 0) 
    { 
     panelPlanning.Height = userList.Count * userHeight; 
     panelUsers.Height = userList.Count * userHeight; 
    } 
    if (nrResources == 0) 
    { 
     nrResources = 10; 
    } 
    userHeight = panel1.Height/nrResources; 

    panel1.VerticalScroll.Value = scrollvalue * panel1.Height/lastHeight; 
    panel1.VerticalScroll.Enabled = false; 

    panelPlanning.Controls.Clear(); 
    addPlanning(); 

    this.ResizeBegin += new EventHandler(this_beginResize); 

    panel1.VerticalScroll.Enabled = true; 
    panel1.VerticalScroll.Value = scrollvalue * panel1.Height/lastHeight; 
} 

/// <summary> 
/// Handles maximize and restore 
/// </summary> 
/// <param name="m"></param> 
protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0112) // WM_SYSCOMMAND 
    { 
     // Check your window state here 
     if (m.WParam == new IntPtr(0xF030) || m.WParam == new IntPtr(0xF120)) // Maximize event - SC_MAXIMIZE from Winuser.h 
     { 
      this.ResizeBegin -= new EventHandler(this_beginResize); 

      panelPlanning.Paint -= new PaintEventHandler(panelPlanning_Paint); 
      scrollvalue = panel1.VerticalScroll.Value; 

      if (panel1.Height != 0) 
      { 
       lastHeight = panel1.Height; 
      } 

      this.SuspendLayout(); 
      SuspendDrawing(panelTimeline); 
      SuspendDrawing(panelPipeLine); 
      SuspendDrawing(panel1); 

      panel1.VerticalScroll.Enabled = false; 
     } 
    } 

    base.WndProc(ref m); 

    if (m.Msg == 0x0112) // WM_SYSCOMMAND 
    { 
     // Check your window state here 
     if (m.WParam == new IntPtr(0xF030) || m.WParam == new IntPtr(0xF120)) // Maximize event - SC_MAXIMIZE from Winuser.h 
     { 
      panelTimeline.Controls.Clear(); 
      sub = dtPickerEnd.Value - dtPickerStart.Value; 
      addDayLabels(sub); 

      panelUsers.Controls.Clear(); 
      addUserLabels(); 

      panelPlanning.Paint += new PaintEventHandler(panelPlanning_Paint); 

      ResumeDrawing(panel1); 
      ResumeDrawing(panelTimeline); 
      ResumeDrawing(panelPipeLine); 
      this.ResumeLayout(); 

      if (userList.Count > 0) 
      { 
       panelPlanning.Height = userList.Count * userHeight; 
       panelUsers.Height = userList.Count * userHeight; 
      } 
      if (nrResources == 0) 
      { 
       nrResources = 10; 
      } 
      userHeight = panel1.Height/nrResources; 

      panel1.VerticalScroll.Value = scrollvalue * panel1.Height/lastHeight; 
      panel1.VerticalScroll.Enabled = false; 

      panelPlanning.Controls.Clear(); 
      addPlanning(); 

      this.ResizeBegin += new EventHandler(this_beginResize); 

      panel1.VerticalScroll.Enabled = true; 
      panel1.VerticalScroll.Value = scrollvalue * panel1.Height/lastHeight; 
     } 
    } 
} 
相關問題