Получение ввода из динамически созданных текстовых полей в другую форму - PullRequest
0 голосов
/ 21 октября 2018

Итак, у нас есть способ динамически создать массив текстовых ячеек x по y для ввода значений в него, чтобы позже выполнить некоторые вычисления матрицы, например, определить ранг матрицы.

Чтобы сгенерироватьВ массиве мы используем это:

protected void Form2_Load(object sender, EventArgs e)
        {

            for (int row = 0; row < LinhaText; row++)
            {
                List<TextBox> newLin = new List<TextBox>();
                textboxes.Add(newLin);
                for (int col = 0; col < ColunText; col++)
                {
                    TextBox newbox = new TextBox();
                    newbox.Width = textboxWidth;
                    newbox.Height = textboxHeight;
                    newbox.Top = (row * (textboxHeight + spacing)) + spacing + vOffset;
                    newbox.Left = (col * (textboxWidth + spacing)) + spacing + hOffset;
                    newLin.Add(newbox);
                    this.Controls.Add(newbox);

                }
            }
        }

Это стоит во второй форме, так как в первой мы вводим размеры массива.Когда мы вводим значения в текстовые поля, они должны быть отправлены в третью форму для использования другими вычислениями.Нам интересно, как мы берем значения и отправляем их в другую форму для последующего отображения результатов.Если вам нужна дополнительная информация, просто спросите!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Я бы не обошел текстовые поля, вместо этого храню числа в 2-мерном массиве (матрице).Также я бы использовал привязку для автоматической привязки значений матрицы к текстовым полям.Чтобы привязка работала, вам нужен вспомогательный класс, содержащий ваши значения, потому что привязка должна связываться со свойством.

private class Data // Can be a nested private class in Form2.
{
    public double Value { get; set; }
    public override string ToString() => Value.ToString(); // Not strictly necessary, but
                                                           // makes debugging easier.
}

Мы создаем поле _matrix, а также свойство, преобразующее эту матрицу Data[,]к матрице double[,] и ее возврату (в Form2):

private Data[,] _matrix;

public double[,] Matrix
{
    get {
        var m = new double[LinhaText, ColunText];
        for (int row = 0; row < LinhaText; row++) {
            for (int col = 0; col < ColunText; col++) {
                m[row, col] = _matrix[row, col].Value;
            }
        }
        return m;
    }
}

Теперь создайте текстовые поля и привяжите их к объекту DataForm2_Load или в конструкторе формы после InitializeComponent):

_matrix = new Data[LinhaText, ColunText];
for (int row = 0; row < LinhaText; row++) {
    for (int col = 0; col < ColunText; col++) {
        var newbox = new TextBox {
            Width = textboxWidth,
            Height = textboxHeight,
            Top = (row * (textboxHeight + spacing)) + spacing + vOffset,
            Left = (col * (textboxWidth + spacing)) + spacing + hOffset
        };

        // Create Data object, add it to the matrix and bind it to the TextBox.
        var data = new Data();
        _matrix[row, col] = data;
        newbox.DataBindings.Add(new Binding("Text", data, "Value", true));

        Controls.Add(newbox);
    }
}

Обратите внимание, что привязка работает в двух направлениях.Если вы инициализируете матрицу числами, они будут отображаться в текстовых полях при открытии формы.Числа, введенные в текстовые поля, будут сохранены в матрице.


Теперь, в другой форме вам нужна ссылка на эту форму.Затем вы можете получить матрицу с помощью

double[,] matrix = frmMartixInput.Matrix;

Если у вас возникнут трудности с передачей ссылок на формы, используйте статическое свойство в статическом классе для матрицы, на которое могут ссылаться все формы.

public static class Globals
{
    public static double[,] Matrix { get; set; }
}

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

0 голосов
/ 21 октября 2018

Я предполагаю, что это не модальные окна и что пользователь может переключаться между ними в любой момент?Если это так, то я бы предложил использовать шаблон проектирования, такой как MVC или MVVM, для разделения ваших данных, представления и логики управления.Сохраняя слой данных отличным от представления, вы можете сделать так, чтобы все ваши окна (представления) использовали одни и те же базовые данные.Конечно, вы захотите использовать события для уведомления различных окон о том, когда данные изменяются (см. Интерфейс INotifyPropertyChanged).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...