Перезаполните поле формы из другого класса в C # - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь заполнить текстовое поле из отдельного класса. Я просмотрел несколько экземпляров этого же вопроса и нашел то, что мне показалось хорошим решением. Но я не могу заставить это работать. Я попытался решить проблему, создав отдельный поток для отправки данных обратно. Я не знаю, отличная идея или нет. Но я знаю, что данные возвращаются в правильное место без них, потому что они отображаются в консоли. Какие-либо предложения? Спасибо!

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public void updater(double value)
    {
        textBox1.Text = value.ToString(); // Trying to update here
        Console.WriteLine(value);  // The new multiple makes if back to here...
    }

    private void button1_Click(object sender, EventArgs e)
    {
        CALC c = new CALC();
        c.valuecalculator(.0025);
    }
}

public class CALC
{
    public void valuecalculator(double multiplier)
    {
        for (int index = 0; index < 1000; index++)
        {
            Form1 f = new Form1();
            double newMultiple = index * multiplier;
            f.updater(newMultiple);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Вы создаете новую копию формы в методе valuecalculator, но вы должны использовать ту же форму.

Существует множество способов решить эту проблему.

Вы можетепередать экземпляр формы в ваш метод valuecalculator.

Вы можете сделать ссылку на форму статической в ​​вашем Program.cs или любом другом файле запуска, который изначально инициализирует его.

Вы можете дать формуссылка на себя

Вы можете поместить код для обновления формы в событие click1 (это имеет смысл), заставив valuecalculator возвращать результат вместо возврата void

0 голосов
/ 30 октября 2019

Ваши компоненты должны делать только одно. Калькулятор должен выполнить расчет и вернуть результат:

public static class Calc
{
    public static double CalculateValue(double multiplier)
    {
        return 100 * multiplier;
    }
}

Формы должны быть максимально простыми. Это означает, что они касаются только отображения элементов формы и передачи событий в обработчики событий. Фактическая логика, которая происходит в этих обработчиках событий, должна быть чужой ответственностью. Мне нравится передавать эту логику в конструкторе:

public partial class Form1 : Form
{
    public Form1(Func<double, double>CalculateValue)
    {
        InitializeComponent();
        button1.Click += (sender, eventArgs) => textBox1.Text = CalculateValue(.0025).ToString();
    }

}

Создание и соединение классов друг с другом - еще одна обязанность. Простейшая версия - использовать метод Main ():

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var form = new Form1(Calc.CalculateValue);
        Application.Run(form);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...