تنفيذ رمز المكون قبل أو بعد حدث form_load في .NET WinForms؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

لدي مكون يتعارض مع مكون آخر يعالج بعض الترجمات الداخلية.

ما يحدث هو أن يتم تنفيذ مكونات منطق العمل ، ثم يتم تنفيذ نظام الترجمة ، الذي يلتقط النصوص الموجودة الآن في النموذج ، ويحاول ترجمتها.

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

أتساءل كيف يمكنني الحصول على مكون أقوم بتنفيذ رمزه في وقت محدد في عمر النموذج.

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

لذلك أنا أتساءل ، هل هناك طريقة بالنسبة لي ، من مكون (أي المنحدر من مكون, ، ليس عنصر تحكم مرئي) ، لتنفيذ التعليمات البرمجية قبل أو بعد Form_Load ، أو على الأقل بعد إعداد جميع المكونات الأخرى وعناصر التحكم؟

لا يبدو أن أي رابط من داخل المكون يعود إلى النموذج ، لذلك لا يبدو لي أن أقوم بربط حدث التحميل ممكنًا أيضًا.

أم أنا نباح الشجرة الخاطئة؟

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

المحلول

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

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

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Component1 : Component {
    public Component1() {
      InitializeComponent();
    }
    public Component1(IContainer container) {
      container.Add(this);
      InitializeComponent();
    }

    [Browsable(false)]
    public ContainerControl Host {
      get { return mHost; }
      set {
        if (mHost == null && value as Form != null && !DesignMode) {
          (value as Form).Load += Initialize;
        }
        mHost = value;
      }
    }
    private ContainerControl mHost;

    public override ISite Site {
      set {
        base.Site = value;
        if (value != null) {
          // Assign Host at design time
          IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
          if (service != null) {
            IComponent rootComponent = service.RootComponent;
            this.Host = rootComponent as ContainerControl;
          }
        }
      }
    }
    private void Initialize(object sender, EventArgs e) {
      Console.WriteLine("initializing...");
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top