【问题标题】:Textbox values into int array文本框值转换为 int 数组
【发布时间】:2012-07-05 22:51:43
【问题描述】:

我的表格是这样的:

http://content.screencast.com/users/TT13/folders/Jing/media/7689e48c-9bd6-4e22-b610-656b8d5dcaab/2012-07-06_0347.png

x, y, A,B,C 是矩阵。 x 的文本框被命名为 x1,...,x6A 的文本框被命名为

a11,...,a16
...
a61, ... ,a66

它们都是整数。我想要做的是,将这些值放入数组中,例如:

x=(20,...,756);

和 A 成二维数组,如 a[1][1]=932 ... a[6][6]=666

如果是,如何?与组框?我不知道如何解决这个问题。提前谢谢

【问题讨论】:

    标签: c# winforms visual-studio-2010 visual-studio textbox


    【解决方案1】:

    看到您的控件名称嵌入了我们可以编写的矩阵位置
    这里没有错误检查,我假设数字总是整数......

        int[] xMatrix = new int[6];
        int[,] aMatrix = new int[6,6];
    
        foreach (Control control in this.Controls) 
        { 
            if (control is TextBox) 
            { 
                string pos = control.Name.SubString(1);
                if(control.Name.StartsWith("a"))
                {
                    int matrixPos = Convert.ToInt32(pos) ;
                    int x = (matrixPos / 10) - 1;
                    int y = (matrixPos % 10) - 1;
                    aMatrix[x,y] = Convert.ToInt32(control.Text);
                }
                else if(control.Name.StartsWith("x")
                {
                    int arrayPos = Convert.ToInt32(pos) - 1;
                    xMatrix[arrayPos] =  Convert.ToInt32(control.Text);
                }
            } 
        } 
    

    【讨论】:

    • 抱歉回答晚了,这里是晚上。所以问题出在控件的名称上。 (x1、x2 等)。它们从 1 开始,而矩阵索引应该从零开始。添加了 -1 来补偿
    【解决方案2】:

    你可以做这样的事情(假设你有一个包装文本框的父控件)。在我的例子中,它是一个 id 为“pnlMain”的 asp:Panel 控件:

    // Collection to hold your matrices
    List<List<int>> myMatrices = new List<List<int>>();
    // Iterate through all rows and columns
    for (int i = 0; i <= 60; i = i + 10)
    {
        var matrix = new List<int>();
        for (int j = 1; j <= 6; j++)
        {
            // Dynamically search parent control for child textboxes
            var txt = pnlMain.FindControl(string.Format("{0}{1}", i == 0 ? "x" : "a", i + j)) as TextBox;
            if (txt != null)
            {
                int value = 0;
                int.TryParse(int.Parse(txt), out value);
                matrix.Add(value);
            }
        }
        myMatrices.Add(matrix);
     }      
    

    【讨论】:

      【解决方案3】:

      您可以通过编程方式添加它们,同时将它们存储在矩阵中,而不是使用设计器手动将文本框放置在表单上。

      const int N = 6;
      
      TextBox[,] _matrixATextBoxes = new TextBox[N, N];
      
      public MyForm() // Form Constructor.
      {
          InitializeComponent();
          SuspendLayout();
          int x = 50; // Horizontal position of first TextBox.
          for (int ix = 0; ix < N; ix++) {
              int y = 80; // Vertical position of first TextBox.
      
              for (int iy = 0; iy < N; iy++) {
                  var tb = new TextBox();
                  tb.Location = new Point(x, y);
                  tb.Size = new Size(23, 40);
                  _matrixATextBoxes[ix, iy] = tb;
                  Controls.Add(tb);
                  y += 30; // Vertical distance
              }
              x += 50; // Horizontal distance
          }
          ResumeLayout();
      }
      

      现在您可以轻松阅读内容了

      int a[,] = new int[N, N];
      for (int ix = 0; ix < N; ix++) {
          for (int iy = 0; iy < N; iy++) {
              int value;
              Int32.TryParse(matrixATextBoxes[ix, iy].Text, out value);
              a[ix, iy] = value;
          }
      }
      

      (未测试。)

      【讨论】:

        【解决方案4】:

        你不能只手动创建数组吗?

        int[] X = new int[] {x1.Value,x2.Value,x3.Value,x4.Value,x5.Value,x6.Value };
        int[,] A = new int{ {a11.Value, a12.Value, a13.Value, a14.Value, a15.Value, a16.Value },
                            {a21.Value, a22.Value, a23.Value, a24.Value, a25.Value, a26.Value },
                            {a31.Value, a32.Value, a33.Value, a34.Value, a35.Value, a36.Value },
                            {a41.Value, a42.Value, a43.Value, a44.Value, a45.Value, a46.Value },
                            {a51.Value, a52.Value, a53.Value, a54.Value, a55.Value, a56.Value },
                            {a61.Value, a62.Value, a63.Value, a64.Value, a65.Value, a66.Value } };
        

        虽然它没有实现任何巧妙的技巧,但它非常简单快捷。而且由于文本框的数量一旦开始使用就不太可能发生变化,因此像这样对其进行硬编码应该没有问题。

        另外,您应该使用方形数组 [,] 而不是锯齿状数组 [][] 因为锯齿状数组在每一行上可能有不同的长度,这在矩阵中是不希望的,并且将其声明为方形将更清楚。

        【讨论】:

        • 另外,这样做意味着不必投入大量的后台工作来重现,本质上,这个。如果您要处理不同的尺寸,您只需要可扩展且灵活的解决方案。
        【解决方案5】:

        由于您已经固定了文本框(也就是说,您不是动态创建它们),您可以转到您的表单定义并为 Tag 属性赋值。

        从表单的左侧开始,它看起来像这样:

        x.1 x.2 x.3 x.4 x.5 x.6
        1.1 1.2 1.3 1.4 1.5 1.6
        2.1 2.2 2.3 2.4 2.5 2.6
        ...
        

        然后您将遍历所有检索它的文本框,例如:

                string textboxMatrix;
                int textboxValue;
        
                foreach (Control control in this.Controls)
                {
                    if (control is TextBox)
                    {
                        textboxMatrix = ((TextBox)control).Tag.ToString();
                        textboxValue = Convert.ToInt32(((TextBox)control).Text);
        
                        if (textboxMatrix.StartsWith("x"))
                        {
                            int xPosition = Convert.ToInt32(textboxMatrix.Split('.')[1]);
        
                            x[xPosition] = textboxValue;
                        }
                        else
                        {
                            int aX = Convert.ToInt32(textboxMatrix.Split('.')[0]);
                            int aY = Convert.ToInt32(textboxMatrix.Split('.')[1]);
        
                            A[aX, aY] = textboxValue;
                        }
                    }
                }
        

        OR,有名字(如你所说):

                    string textboxMatrix;
                    int textboxValue;
        
                    foreach (Control control in this.Controls)
                    {
                        if (control is TextBox)
                        {
                            textboxMatrix = ((TextBox)control).Name;
                            textboxValue = Convert.ToInt32(((TextBox)control).Text);
        
                            if (textboxMatrix.StartsWith("x"))
                            {
                                int xPosition = Convert.ToInt32(textboxMatrix.ToCharArray()[1]);
        
                                x[xPosition] = textboxValue;
                            }
                            else
                            {
                                int aX = Convert.ToInt32(textboxMatrix.ToCharArray()[1]);
                                int aY = Convert.ToInt32(textboxMatrix.ToCharArray()[2]);
        
                                A[aX, aY] = textboxValue;
                            }
                        }
                    }
        

        【讨论】:

        • 不太清楚,你这个答案是什么意思,请解释一下你的答案
        • 好的。知道了。但我已经将它们命名为 x1、x2 .. a11。我们可以让这个函数不使用标签而是使用名称吗?还是没有办法?
        • 更新了两个选项,看看
        猜你喜欢
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多