【问题标题】:Grabbing input from dynamically created textboxes to another form从动态创建的文本框抓取输入到另一个表单
【发布时间】:2018-10-21 18:09:38
【问题描述】:

因此,我们有一种方法可以动态创建一个由 texbox 组成的 x 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);

                }
            }
        }

这代表第二种形式,就像在第一种形式中我们输入数组的维度一样。当我们在文本框中输入值时,它们应该被发送到第三种形式以供其他计算使用。 我们想知道如何获取这些值并将它们发送到另一个表单以便稍后显示结果。 您需要任何进一步的信息,尽管问!

【问题讨论】:

  • 您需要显示更多代码。 textboxes 在哪里声明?您的第二种形式的实例在哪里声明?显示所有相关代码

标签: c# arrays winforms textbox


【解决方案1】:

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

【讨论】:

  • 这不是 OP 所要求的,根据问题的线索,它可能比必要的要高级一些。
  • 问题是询问在多个表单之间迁移数据 - 更具体地说是 winforms。我可能对他的理解有误,但在回去重新阅读后,我仍然有同样的印象。
  • 我想将表单2上创建的文本框的数据发送到表单3,作为一个我可以调用的东西像一个变量,所以我可以稍后在高斯消除方法中使用它.
  • @JoãoFerreira - 您能否确认用户可以同时在这些表单之间切换(与必须关闭才能返回原始表单的模式类型对话框相比)?如果是这样,我认为上述答案是最好的方法——尽管它是先进的。
  • 用户从一个表单到另一个表单,从输入数组维度的第一个表单开始,然后单击一个按钮,它转到第二个表单,在该表单中获取这两个全局变量构建数组。在第二种形式中,应输入数字以计算第三种形式的内容。
【解决方案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;
    }
}

现在创建文本框并将它们绑定到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; }
}

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

【讨论】:

  • 除了第三部分,我应该把每一段代码放在哪里?
  • 在带有文本框的表单中 (Form2)。
  • 放置double[,]矩阵时= frmIntroMatriz.Matrix;它给出了一条错误消息:非静态字段、方法或属性“frmIntroMatriz.Matrix”需要对象引用我做错了什么?
  • 因为frmIntroMatriz是一个类型(一个类)。您必须引用表单对象。例如。 var frm = new frmIntroMatriz(); frm.ShowDialog(); double[,] matrix = frm.Matrix;.
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多