Thursday, May 10, 2012

Docking a Form into a Panel

เกริ่นนำ
การโหลดฟอร์ม ให้ไปแสดงอยู่บน Panel ตัวอย่างที่ 1-2นี้ผมก็ยังไม่ค่อยปลื้มเท่าไหร่ กับผลลัพธ์ที่ได้ออกมา( แต่อันที่ 3 สมบูรณ์แบบครับ อันนี้นายฝรั่งส่งมาให้หลังจากเขียนบทความนี้ไปแล้ว) ซึ่งผมว่ามันน่าจะเนียนกว่านี้ แต่มีอยู่ 2 วิธีที่หามาได้ แต่ก็ยังไม่สมบูรณ์แบบ แต่พอเป็นแนวทางให้ไปพัฒนาต่อไปได้ อย่างแรก การโหลดโดยใช้ Controls โหลดตรงๆเลยตามตัวอย่างดังนี้
วิธีที่ 1 การโหลดคอนโทรล
1
2
3
4
5
6
TestForm1 temp = new TestForm1();
this.dockPanel7.Controls.Clear();
foreach (Control c in temp.Controls)
dockPanel7.Controls.Add(c);
 
temp.Dispose();
จากตัวอย่างเท่าที่ผมทำ มันโหลดให้และดูดีมากครับ แต่มันโหลดไม่ครบทุก คอนโทรล ไม่รู้ว่าสาเหตุมาจากอะไร ?
วิธีที่ 2 การโหลดฟอร์มอย่างที่สอง การโหลดทั้งฟอร์มครับ ตามนี้
1
2
3
4
5
6
7
8
TestForm1 temp = new TestForm1();
temp.TopLevel = false;
temp.Dock = DockStyle.Fill;
temp.WindowState = FormWindowState.Maximized;
temp.ShowInTaskbar = false;
this.dockPanel7.Controls.Clear();
this.dockPanel7.Controls.Add(temp);
temp.Show();
จะเห็นว่าใน panel จะเห็นทั้งฟอร์ม และมี Title Bar ด้วย
วิธีที่ 3 การโหลดฟอร์มแบบสมบูรณ์
ส่วนวิธีที่ 3 อันนี้สมบูรณ์แบบแล้วครับต่อยอดมาจากวิธีที่ 2 จะเห็นว่าเพิ่ม Panel1 ลงไปบน dockPanel7 อีกทีครับ แล้ว กำหนด temp.Dock = DockStyle.Fill;
01
02
03
04
05
06
07
08
09
10
TestForm1 temp = new TestForm1();
temp.TopLevel = false;
 
temp.FormBorderStyle = FormBorderStyle.None;
temp.Dock = DockStyle.Fill;
temp.MaximizeBox = false;
temp.MinimizeBox = false;
temp.ControlBox = false;
panel1.Controls.Add(temp);
temp.Show();
รูปตัวอย่างที่สมบูรณ์ก็ได้ออกมาดังนี้
จะเห็นได้ว่าเนียนขึ้นเยอะครับ รวมทั้งไม่มีรอยแตกระหว่างเฟรมด้วย อันนี้ก็ลองดูเองแล้วกันครับจะได้เห็นความแตกต่าง

1 comment:

  1. You deserve I comment saying a big good feedback for you , Your solution (method 1) helped me really to do what I needed. Thanks you man.

    ReplyDelete