Como modificar uma caixa richtext de outra forma em C#.NET
-
20-09-2019 - |
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?
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.