我在一個較大的面板內有2個面板。 2個內部面板自動調整大小,外部面板自動滾動,以便我可以向下滾動2個面板的內容。面板在向下滾動時丟失內容
我使用繪畫事件在右側面板上繪製網格線,並且兩者都有標籤控件。
這一切工作正常(也調整大小和響應),但當我滾動下來一些奇怪的事情發生。
所以說我稱之爲當你的滾動條處於最初狀態時看到的東西。然後,當我向下滾動,沒有任何的初始狀態是可見的,我調整/最小化/刷新...我的右側面板(與網格線和標籤)灰色,一切都消失。
只有當我再次向上滾動並打到初始狀態的底部時,標籤和圖形纔會回來。
我知道這可能很難理解,但如果您認爲自己能夠提供幫助,可以隨時要求澄清任何事情。
向下滾動和縮放/最小化後的初始狀態 - 恢復......當我到了一些東西,是在初始狀態
一切再次出現
右側面板的繪畫事件(雖然我懷疑它會有很多用途)
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);
}
無論其,我仍然遇到問題。當我調整大小和窗體變大或我從最大化或最小化狀態恢復窗口時,滾動條以一種奇怪的方式起作用。 當它一直向下並且表格變得更大時,它將停留在面板的相同高度,從而向上移動。 在恢復時,滾動條總是回到頂部。 任何想法?
歡迎使用截圖和一些代碼。 – 2013-04-24 11:09:08
我會嘗試發佈一些截圖。你想看哪個代碼?網格線的Paint事件? – 2013-04-24 11:09:47
您認爲相關的任何代碼。當你向下滾動一下時,你描述的是否會發生? – 2013-04-24 11:12:31