PDA

View Full Version : Chuyện đóng form trong C#.......



minhtienht
02-10-2007, 19:38
Bác nào tư chất thông minh nghĩ hộ mình với :
Mình muốn đóng 1 normal form khi đang làm việc với 1 normal form khác thì phải làm như thế nào vậy.

t3hhaiquy
03-10-2007, 08:34
Cái bạn hỏi khó hiểu thật đấy.Chi tiết hơn tý nữa được kg ạ!

hongthang1110
03-10-2007, 08:58
Nói cụ thể nữa đi Tiến.

minhtienht
03-10-2007, 10:36
Hic! Mình có 2 normal form trong 1 project(form1 va form2).
Giả sử 2 form này đều đang mở.
Và trên form1 có button1,các bạn làm thế nào để click vào button1 thì
form2 đóng lại được không?

hongthang1110
04-10-2007, 00:04
//Trong Form1 bạn khai báo khởi tạo 1 thể hiện Form2 như sau:
Form2 frmForm2;

//Sau đó viết mã cho Form1_Load như sau:
private void Form1_Load(object sender, EventArgs e)
{
frmForm2 = new Form2();
frmForm2.Show();
}
//Sự kiện button1_Click như sau:
private void button1_Click(object sender, EventArgs e)
{
frmForm2.closeForm();
}

//Ở Form2 chỉ cần thêm 1 phương thức closeForm() như sau:
public void closeForm()
{
this.Dispose();
}

Chúc thành công !

minhtienht
04-10-2007, 11:58
Hì hì! Thanks n`n`!Mình loay hoay mãi mà không bao giờ nghĩ dùng phương thức.

BabyOneMoreTime
12-10-2007, 11:36
Các bác cho em hỏi xí,giờ làm sao khi chương trình chạy thì đầu tiên form1 mở lên trước ,sau đó nhấn vào 1 button trên form1 thì form2 mở lên,form1 đóng lại ?đã thử cách bên trên nhưng ko được ~.~
p/s:em dùng C# 2005

t3hhaiquy
12-10-2007, 14:27
Mình đang thử dùng thuộc tính Hide của form thì được đó bạn nhưng ý bạn là muốn nó thoát hẳn luôn rồi sau khi mở lại thì nó load lên hay chỉ ẩn đi giống như mình nói!

minhtienht
12-10-2007, 18:15
Các bác cho em hỏi xí,giờ làm sao khi chương trình chạy thì đầu tiên form1 mở lên trước ,sau đó nhấn vào 1 button trên form1 thì form2 mở lên,form1 đóng lại ?đã thử cách bên trên nhưng ko được ~.~
p/s:em dùng C# 2005

Không bao giờ làm được chuyện đó đâu bạn ạ.
Bạn thử dùng button1 thuộc form1 để mở form2 (nhớ là dùng phương thức show())
sau đó bạn trỏ chuột tới form1 và tắt nó đi thì cái gì bạn nhìn thấy trên màn hình sẽ CM câu hỏi của bạn không có đáp án.
Mình cũng chả hiểu tại sao nó lại như vậy nữa (2 normal form mà T_T!).
Có bác nào biết không?

BabyOneMoreTime
14-10-2007, 12:01
Chậc ,vậy thì mấy cái chương trình trắc nghiệm nó làm sao nhỉ o.O .Mở đầu là 1 form ,bấm vô bắt đầu thì form mở đầu đóng ,form bài làm hiện lên ,khi kết thúc thì form bài làm đóng ,form kết quả hiện lên ,có ai có cao kiến gì ko :|

riahk
14-10-2007, 12:56
Chương trình trắc nghiệm của tui thì thế này.
Form chính có 1 cai panel.
Form1 kế thừa panel.
Form2 kế thừa panel.
Trong form chính:
click button1: panel=new Form1();
click button2: panel=new Form2();
Nếu làm như thế này thì từ đầu đến cuối tất cả chỉ có 1 form thôi. Tùy theo xử lí mà ta load cái nào lên. Các form liên lac với nhau qua thuộc tính public. Gặp trường hợp gay go lắm thì xài static.

tuongtieudan
14-10-2007, 21:32
Theo mình thì không có gì là không thể có điều ta chưa nghĩ ra thôi. Em cũng đang giải quyết thử vấn đề đó. Bác nào sử lí đc rồi thì post cho anh em coi nhé.

minhtienht
17-10-2007, 21:55
Sorri sorri nhiều!
Mình bộp chộp quá. Nghe mọi người nói thì thử làm lại thấy được.
Trong program.cs các bạn thử cho chạy
Application.Run(new Form1());
Application.Run(new Form2());
Sau đó vào sự kiện click của button1 thuộc form1 viết dễ dàng các dòng lệnh sau:
Form frm = new Form2();
frm.Show();
this.Dispose();
Cuối cùng F5. Mọi người làm thử xem như vậy được không...

toanan308
17-10-2007, 22:00
wủa thật hay nhung em làm mãi mà ko đươc bác có trhể chỉ kĩ hơn 1 tý ko

minhtienht
17-10-2007, 22:12
Thì tạo lấy 2 cái form1 và form2 rồi kéo button1 vào form1 xong click đúp vào nó. Công việc còn lại chỉ là copy và paste?

BabyOneMoreTime
19-10-2007, 12:46
Sorri sorri nhiều!
Mình bộp chộp quá. Nghe mọi người nói thì thử làm lại thấy được.
Trong program.cs các bạn thử cho chạy
Application.Run(new Form1());
Application.Run(new Form2());
Sau đó vào sự kiện click của button1 thuộc form1 viết dễ dàng các dòng lệnh sau:
Form frm = new Form2();
frm.Show();
this.Dispose();
Cuối cùng F5. Mọi người làm thử xem như vậy được không...

hay quá ,cuối cùng cũng có 1 cách xài được ,tuy nhiên nếu xài cách này sẽ phát sinh 1 lỗi đó pác ,nếu như mình có 2 form ,form 1 mở lên mà mình bấm vào dấu x để tắt đi thì nó ko tắt chương trình mà chỉ đóng form 1 lại rồi bật form 2 lên :| .Không biết có hướng giải quyết nào ko ?

zxc
20-10-2007, 21:16
Trong Program để một cái list static, đầu tiên chỉ add cái form1 vào list thôi, sau đó chạy vòng lặp, nếu thấy list không rỗng thì lấy nó ra và run nó.

Ở form1 khi click vào button1 thì add thêm cái form2 vào list và đóng form1.

KEM_WALL
21-10-2007, 22:33
Bạn có thể dùng cách sau đây, áp dụng Singleton Pattern cho form1 form2.



public class Form1
{
// biến lưu instance của form1
private static Form1 m_Instance;
// mỗi khi cần gọi form1, bạn không cần tạo biến nữa
// mà chỉ cần gọi như sau: Form1.Instace
public Form1 Instance
{
get
{
// nếu m_Instance = null, có nghĩa là Form1 chưa được khởi tạo lần nào
// bạn cần khởi tạo nó
if (m_Instance == null)
m_Instance = new Form1();
return m_Instance;
}
}
}
// tương tự cho form2
public class Form2
{
private static Form2 m_Instance;
public Form2 Instance
{
get
{
if (m_Instance == null)
m_Instance = new Form2();
return m_Instance;
}
}
}


trong main() của bạn, gọi dòng sau (giả sử form1 là form đầu tiên xuất hiện)


Application.Run(Form1.Instance);

sau đó, trong đoạn code của buttonShowForm2_click trong form1 chẳng bạn. bạn muốn show form2. đơn giản gọi:


Form2.Instance.Show();

trong một đoạn code khác, vd của buttonCloseForm2_click trong form1 chẳng bạn. bạn muốn Close form2. đơn giản gọi:


Form2.Instance.Close();


đây chỉ là một kĩ thuật cơ bản, bạn có thể search google về singleton sẽ có rất nhiều ví dụ và giải thích.
Cũng xin lỗi trước vì đoạn code ví dụ là code = notepad nên walls nghĩ nó không hoàn toàn chính xác về syntax. về close form, bạn nên chắc nó đã được show trước khi gọi close ;).

hope this help you,

Best regards,

ngochieu989
23-10-2010, 16:45
Các bák cho em hỏi với, em đang dùng Office 2007, tại sao sau khi thoát Form đã thiết kế rồi sau khi mở lên nó lại không hoạt động nữa?(nếu lập Form khác rồi coppy tất cả câu lệnh qua thì nó vẫn chạy, khi thoát rồi mở lên lại nó lại không chạy nữa). Mong các bák chỉ giúp em với, em xin cảm ơn!

kennywoo
12-11-2010, 19:38
Qua WPF thì ko còn khái niệm Dispose nữa. Mình cũng vướng mắc như chủ topic thử mọi cách mà vẫn ko được haizz
Nói tóm là như vầy : Mình có 2 form f1 gọi f2 lên và f1 đóng lại(đóng lại hẳn chứ không phải this.Visibility = Visibility.Hidden; )
Mình thử mọi cách nhưng không thành công vì khi mình Close f2 thì f1 vẫn nằm đó trong task
Mong các bạn giúp đỡ

littleNeo
13-11-2010, 10:02
Qua WPF thì ko còn khái niệm Dispose nữa. Mình cũng vướng mắc như chủ topic thử mọi cách mà vẫn ko được haizz
Nói tóm là như vầy : Mình có 2 form f1 gọi f2 lên và f1 đóng lại(đóng lại hẳn chứ không phải this.Visibility = Visibility.Hidden; )
Mình thử mọi cách nhưng không thành công vì khi mình Close f2 thì f1 vẫn nằm đó trong task
Mong các bạn giúp đỡ

Bạn làm sao ấy chứ, tớ làm WPF bình thường. WPF Window khi gọi close là nó dispose luôn rồi.
Có điều quan trọng nhưng ko ảnh hưởng đến chuyện show/hide form là form đầu tiên show lên sẽ được xem như MainWindow của Application, nên khi bạn close MainWindow và show 1 Window mới thì bạn nên set form mới thành MainWindow của Application. Cái này chỉ là Best Practice thôi, vì khi làm WPF, project càng lớn thì việc sử dụng Application.Current.MainWindow sẽ rất thường xuyên.

kennywoo
13-11-2010, 11:45
Ok tớ hiểu rồi. Thanks cậu :)