Question

Je construis un Bloc-notes. J'ai Rechercher et remplacer forme. Lorsque je clique sur un bouton qui ouvre la forme, l'utilisateur donne deux entrées dans deux zones de texte et appuyez sur un bouton. Ensuite, les RichTextBoxes de la forme principale est censée se modifier.

Voici la forme du formulaire 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();
        }

Le problème est son ne fonctionne pas .. Je reçois un NullReferenceException dans la ligne f1.MainText.Replace(findMe, replaceMe); Toute idée?

Était-ce utile?

La solution

Ici, vous créez une nouvelle instance de la forme:

Form1 f1 = new Form1();

Toutes les propriétés sont initialisées à leurs valeurs par défaut (à savoir des chaînes à null). Ensuite, vous essayez d'appeler Replace méthode sur la propriété MainText qui est null et vous obtenez l'exception:

f1.MainText.Replace(findMe, replaceMe);

Vous devez d'abord initialiser cette propriété:

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

Mise à jour:

Lorsque vous créez le formulaire de FindAndReplace vous pouvez passer à son constructeur la valeur actuelle du texte:

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

Autres conseils

Votre recherche et de remplacement formulaire doit savoir sur votre formulaire principal. La façon dont vous le faites, vous créez une toute nouvelle forme principale, qui aura aucun texte dans la zone de texte. Lorsque vous créez Rechercher et remplacer formulaire, vous devez transmettre votre formulaire parent, ou même simplement le texte principal, à la rechercher et remplacer forme, puis recherchez le texte principal de la forme de la forme vient de passer dans.

Vous voulez quelque chose comme ce qui suit:

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

Vous pouvez ajouter des références de forme statique à votre classe de programme.

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

Alors, de toute forme dans votre application, vous serez en mesure d'utiliser Program.Form1 ou Program.Form2 comme une référence déjà instancié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top