将动态创建的文本框的输入捕获到另一种形式

时间:2018-10-21 18:09:38

标签: c# arrays winforms textbox

因此,我们有一种方法来动态创建一个由y个texbox组成的x数组,以将值输入到其中,以便稍后进行一些矩阵计算,例如确定矩阵的等级。

要生成数组,请使用以下代码:

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 :(得分:1)

我假设这些不是模式窗口,并且用户可以随时在它们之间切换?如果是这种情况,那么我建议您使用MVC或MVVM之类的设计模式,分离数据,视图和控制逻辑。通过使数据层与视图区分开,可以使所有窗口(视图)共享相同的基础数据。当然,您将需要使用事件来通知各个窗口何时更改数据(请参见INotifyPropertyChanged接口)。

答案 1 :(得分:1)

我不会绕过文本框,而是将数字存储在二维数组(矩阵)中。另外,我将使用绑定将矩阵值自动绑定到文本框。要使绑定生效,您需要一个包含您的值的辅助类,因为绑定需要绑定到属性。

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

现在创建文本框并将其绑定到Data对象(在Form2_LoadInitializeComponent之后的表单构造函数中):

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

您还可以通过构造函数参数(对其他表单的引用或矩阵本身)将数据传递给表单。