سؤال

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

وهنا شكل شكل FindAndReplace:

private void btnReplaceAll_Click(object sender, EventArgs e)
        {
            string findMe = txtFind.Text;
            string replaceMe = txtReplace.Text;
            Form1 f1 = new Form1();
            f1.MainText.Replace(findMe, replaceMe);
            //this.Hide();
        }

والمشكلة هي لا يعمل .. أنا الحصول على NullReferenceException في f1.MainText.Replace(findMe, replaceMe); خط أي فكرة؟

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

المحلول

وهنا يمكنك إنشاء مثيل جديد من النموذج:

Form1 f1 = new Form1();

ويتم تهيئة جميع الخصائص إلى قيمها الافتراضية (أي سلاسل لاغية). التالي حاولت الاتصال Replace طريقة على الممتلكات MainText وهو null وتحصل على استثناء:

f1.MainText.Replace(findMe, replaceMe);

وتحتاج إلى تهيئة أولا هذه الخاصية:

f1.MainText = "blablabla";
f1.MainText = f1.MainText.Replace(findMe, replaceMe);

وUPDATE:

عند إنشاء النموذج FindAndReplace هل يمكن أن تمر على المنشئ لها القيمة الحالية من النص:

public class Form1 : Form
{
    protected void FindAndReplace_Click(object sender, EventArgs e) 
    {
        var findAndReplaceForm = new FindAndReplaceForm(MainText.Text);
        findAndReplaceForm.ShowDialog();
        MainText.Text = findAndReplaceForm.NewText;
    }
}

public class FindAndReplaceForm : Form
{
    private readonly string _originalText;

    public FindAndReplaceForm(string originalText)
    {
        _originalText = originalText;
    }

    public string NewText 
    { 
        get 
        {
            return (_originalText ?? string.Empty).Replace(findMe, replaceMe);
        }
    }
}

نصائح أخرى

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

وأنت تريد شيئا مثل ما يلي:

public class FindAndReplaceForm
{
    private Form1 MainForm;

    public FindAndReplaceForm(Form1 parentForm)
    {
        this.MainForm = parentForm;
        //The rest of you constructor here
    }

    private void btnReplaceAll_Click(object sender, EventArgs e)
    {
        string findMe = txtFind.Text;
        string replaceMe = txtReplace.Text;

        //The following line will search the parent form
        this.MainForm.MainText.Replace(findMe, replaceMe);
        //this.Hide();
    }
}

هل يمكن إضافة مراجع شكل ثابتة لفئة البرنامج الخاص بك.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        public static Form1 F1 { get; set; }
        public static Form2 F2 { get; set; }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Form1 = new Form1();
            Form2 = new Form2();

            Application.Run(Form1);
        }
    }
}

وبعد ذلك، من أي شكل في التطبيق الخاص بك، عليك أن تكون قادرا على استخدام Program.Form1 أو Program.Form2 كمرجع مثيل بالفعل.

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