Làm cách nào để tránh nhiều phiên bản cửa sổ trong C# ?? tôi chỉ muốn một ví dụ của biểu mẫu đang chạy. Bởi vì có cơ hội mở cùng một biểu mẫu từ nhiều trang trong đơn đăng ký của tôi.Làm cách nào để tránh nhiều phiên bản cửa sổ trong C#
Trả lời
thực hiện Singleton pattern
một ví dụ: CodeProject: Simple Singleton Forms (ok, đó là trong VB.NET, nhưng chỉ để cung cấp cho bạn một đầu mối)
Bạn có thể kiểm tra các quy trình hiện có trước khi mở hình thức:
using System.Diagnostics;
bool ApplicationAlreadyStarted()
{
return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length == 0;
}
Tôi không biết liệu phương thức GetProcessesByName có bị ảnh hưởng bởi UAC hoặc các biện pháp bảo mật khác hay không.
Nếu bạn đọc câu hỏi, nó không phải về một ứng dụng đơn, nó là về một hình thức trong ứng dụng có thể được mở từ nhiều nơi và chỉ muốn một ví dụ. –
Vâng, nó có Singleton pattern,
Mã để tạo ra một đối tượng singleton,
public partial class Form2 : Form
{
.....
private static Form2 inst;
public static Form2 GetForm
{
get
{
if (inst == null || inst.IsDisposed)
inst = new Form2();
return inst;
}
}
....
}
Invoke/Hiện hình thức này,
Form2.GetForm.Show();
Singletons không hướng đối tượng. Chúng đơn giản là phiên bản đối tượng của các biến toàn cầu. Những gì bạn có thể làm là làm cho hàm tạo của lớp Form là riêng tư, vì vậy không ai có thể vô tình tạo ra một trong số chúng. Sau đó, gọi trong sự phản ánh, chuyển đổi ctor cho công chúng và chắc chắn rằng bạn tạo ra một và chỉ một ví dụ của nó.
Đó là một ý tưởng rất tồi tệ! Hãy xem các tính năng 'lớp tĩnh' của C#, hoặc chỉ sử dụng mẫu đơn. –
Nếu hệ thống của bạn có khả năng hiển thị cùng loại biểu mẫu cho dữ liệu cá thể khác nhau, bạn có thể tạo hệ thống kiểm tra lặp lại tất cả biểu mẫu đang mở, tìm mã nhận dạng dữ liệu cá thể duy nhất và sau đó hiển thị lại mọi biểu mẫu đã tìm thấy .
ví dụ: có một lớp mẫu 'CustomerDetails', trong đó có một tài sản công cộng 'CustomerUniqueID':
foreach(Form f in CurrentlyDisplayedForms)
{
CustomerDetails details = f as CustomerDetails;
if((details != null) && (details.CustomerUniqueUD == myCustomerID))
{
details.BringToFront();
}
else
{
CustomerDetails newDetail = new CustomerDetails(myCustomerID);
}
}
Chúng tôi cũng sử dụng cơ chế tương tự để tự động ép buộc làm mới dữ liệu ràng buộc, nơi dữ liệu của khách hàng đã được chỉnh sửa và lưu lại.
Hãy thử mã này
Public class MyClass
{
//Create a variable named
public static int count = 0;
//Then increment count variable in constructor
MyClass()
{
count++;
}
}
Trong khi tạo đối tượng cho lớp trên 'MyClass' kiểm tra giá trị số lớn hơn 1
class AnotherClass
{
public void Event()
{
if(ClassName.Count <= 1)
{
ClassName classname=new ClassName();
}
}
}
Đây là giải pháp của tôi trong ShowForm():
private void ShowForm(Type typeofForm, string sCaption)
{
Form fOpen = GetOpenForm(typeofForm);
Form fNew = fOpen;
if (fNew == null)
fNew = (Form)CreateNewInstanceOfType(typeofForm);
else
if (fNew.IsDisposed)
fNew = (Form)CreateNewInstanceOfType(typeofForm);
if (fOpen == null)
{
fNew.Text = sCaption;
fNew.ControlBox = true;
fNew.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
fNew.MaximizeBox = false;
fNew.MinimizeBox = false;
// for MdiParent
//if (f1.MdiParent == null)
// f1.MdiParent = CProject.mFMain;
fNew.StartPosition = FormStartPosition.Manual;
fNew.Left = 0;
fNew.Top = 0;
ShowMsg("Ready");
}
fNew.Show();
fNew.Focus();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
ShowForm(typeof(FAboutBox), "About");
}
private Form GetOpenForm(Type typeofForm)
{
FormCollection fc = Application.OpenForms;
foreach (Form f1 in fc)
if (f1.GetType() == typeofForm)
return f1;
return null;
}
private object CreateNewInstanceOfType(Type typeofAny)
{
return Activator.CreateInstance(typeofAny);
}
public void ShowMsg(string sMsg)
{
lblStatus.Text = sMsg;
if (lblStatus.ForeColor != SystemColors.ControlText)
lblStatus.ForeColor = SystemColors.ControlText;
}
Khi bạn hiển thị hộp thoại, chỉ cần sử dụng .ShowDialog();
thay vì .Show();
rất thanh lịch :) tôi thích –
Vẫn còn các trường hợp bạn có thể mở nhiều phiên bản của biểu mẫu, ngay cả khi sử dụng ShowDialog. Ví dụ, từ menu của biểu mẫu chính, sau đó từ menu ngữ cảnh của biểu tượng thông báo. – AnAurelian
Một giải pháp tôi áp dụng cho dự án của tôi nhằm đem lại hình thức này một lần nữa ở mặt trước là:
private bool checkWindowOpen(string windowName)
{
for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name.Equals(windowName))
{
Application.OpenForms[i].BringToFront();
return false;
}
}
return true;
}
windowName thực chất là tên lớp của giá trị trả về Windows Form và của bạn có thể được sử dụng cho không tạo một thể hiện mẫu mới.
bài viết hay. Giải quyết vấn đề của tôi – dilipkumar1007
việc kiểm tra này link:
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
Đây là một cách đơn giản để làm điều đó.
Kiểm tra xem biểu mẫu có bị vô hiệu hay không. Nếu đó là sự thật, chúng tôi tạo ra một thể hiện mới của biểu mẫu.
Nếu không, chúng tôi chỉ hiển thị biểu mẫu đang chạy.
Form form;
private void btnDesktop_Click(object sender, EventArgs e)
{
if (form == null || desktop.IsDisposed)
{
form = new Form();
form.Show();
}
else
{
form.WindowState = FormWindowState.Normal;
}
}
đảm bảo rằng bạn quá tải FormClosing và kiểm tra lý do đóng nếu lý do là người dùng sau đó ẩn biểu mẫu và đặt hủy = true – Peter
+1 Đối với Singleton. Nó thường bị bỏ qua. –