كيفية تجنب حالات متعددة من شكل النوافذ في ج #

StackOverflow https://stackoverflow.com/questions/1403600

  •  05-07-2019
  •  | 
  •  

سؤال

وكيفية تجنب حالات متعددة من شكل النوافذ في ج # ؟؟ أريد مثيل واحد فقط من حيث الشكل على التوالي. لأن هناك فرص فتح نفس النموذج من صفحات عديدة من طلبي.

هل كانت مفيدة؟

المحلول

سينغلتون

وعلى سبيل المثال: CodeProject: أشكال سينغلتون بسيطة (حسنا، انها في VB .NET، ولكن فقط لإعطائك فكرة)

نصائح أخرى

نعم، لديه نمط المفرد،

ورمز لإنشاء كائن مفرد،

public partial class Form2 : Form
{
 .....
 private static Form2 inst;
 public static Form2  GetForm
 {
   get
    {
     if (inst == null || inst.IsDisposed)
         inst = new Form2();
     return inst;
     }
 }
 ....
}

واستدعاء / عرض هذا النموذج،

Form2.GetForm.Show();

وعند عرض الحوار لمجرد استخدام .ShowDialog(); بدلا من .Show();

وحل واحد تقدمت بطلب إلى مشروعي من أجل تحقيق هذا النموذج مرة أخرى في المقدمة هو:

    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 هو في الأساس اسم الفئة من نموذج Windows الخاص بك و يمكن استخدام قيمة مقابل عدم إنشاء مثيل نموذج جديد.

وإذا كان النظام لديه إمكانية لإظهار نفس النوع من استمارة البيانات مثيل مختلفة ثم هل يمكن إنشاء نظام التدقيق التي تتكرر كل النماذج المفتوحة الحالية، وتبحث عن المعرف البيانات مثيل فريدة من نوعها ومن ثم إعادة عرض أي شكل جدت.

ومنها مثلا. وجود فئة النموذج "CustomerDetails 'الذي يحتوي على الممتلكات العامة" 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);
    }
}

ونحن أيضا استخدام نفس الآلية لإجبار ينعش من ربط البيانات تلقائيا حيث تم تحرير بيانات العميل وحفظها.

وهنا هي لغتي حل في 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;
    }

:

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;
      }
   }
}

وحاول هذا الرمز

Public class MyClass
{
    //Create a variable named 
    public static int count = 0;
    //Then increment count variable in constructor
    MyClass()
    {
        count++;
    }
}

وأثناء إنشاء الكائن للفئة المذكورة أعلاه 'MyClass' تحقق قيمة عدد أكبر من 1

class AnotherClass
{
    public void Event()
    {
        if(ClassName.Count <= 1)
        {
            ClassName classname=new ClassName();
        }
    }
}

وإليك طريقة بسيطة للقيام بذلك.

وتحقق مما إذا كان النموذج هو باطل، أو تم التخلص منها. اذا كان هذا صحيحا فإننا إنشاء مثيل جديد من النموذج.

وإلا فإننا مجرد إظهار النموذج التشغيل مسبقا.

    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;
        }
    }
لا كائنية التوجه

وسنغلتونس. هم ببساطة النسخة الكائن المتغيرات العالمية. ما يمكنك القيام به هو جعل منشئ فئة النموذج خاصة، لذلك لا أحد يمكن أن تخلق بالصدفة واحد من هؤلاء. ثم استدعاء في التفكير، وتحويل المنشئ للجمهور، وتأكد من إنشاء واحد وحالة واحدة فقط منه.

ويمكنك التحقق من العمليات القائمة قبل فتح النموذج:

using System.Diagnostics;

bool ApplicationAlreadyStarted()
{
  return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length == 0;
}

وأنا لا أعرف إذا كان يتأثر طريقة GetProcessesByName من UAC أو غيرها من التدابير الأمنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top