Pergunta

Estou construindo um bloco de notas. Eu tenho um formulário de localização e substituição. Quando clico em um botão que o formulário é aberto, o usuário fornece duas entradas em duas caixas de texto e pressione um botão. Em seguida, as caixas RichText da forma principal devem ser modificadas.

Aqui está a forma do FindAndReplace Formato :

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

O problema é que não está funcionando .. estou recebendo uma NullReferenceException na linha f1.MainText.Replace(findMe, replaceMe);Qualquer ideia?

Foi útil?

Solução

Aqui você cria uma nova instância do formulário:

Form1 f1 = new Form1();

Todas as propriedades são inicializadas com seus valores padrão (ou seja, strings para nulos). Em seguida, você tenta ligar para o Replace Método no MainText propriedade que é null E você obtém a exceção:

f1.MainText.Replace(findMe, replaceMe);

Você precisa primeiro inicializar esta propriedade:

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

ATUALIZAR:

Quando você cria o formulário FindandReplace, você pode passar para o construtor o valor atual do texto:

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

Outras dicas

Seu formulário de localização e substituição deve saber sobre o seu formulário principal. Do jeito que você está fazendo, está criando uma forma principal completamente nova, que não terá texto na área de texto principal. Ao criar o formulário de localização e substituição, você deve passar o formulário pai ou mesmo apenas o texto principal, para o formulário de localização e substituição e pesquise o texto principal do formulário do formulário que acabou de passar.

Você quer algo como o seguinte:

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

Você pode adicionar referências de formulário estático à sua classe de programa.

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

Então, de qualquer forma em seu aplicativo, você poderá usar Program.Form1 ou Program.Form2 como uma referência já instanciada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top