2

私のフォームは次のようになります。

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

x, y, A,B,C行列です。右のTexboxesxはとして名前が付けられx1,...,x6、右のtexboxesは次のようAに名前が付けられます

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

それらはすべてintです。私がやりたいのは、この値を次のような配列に入れることです。

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

a[1][1]=932そして、Aを...のような2次元配列に変換しますa[6][6]=666

はいの場合、どのように?グループボックスで?この問題を解決する方法がわかりません。事前にThx

4

5 に答える 5

3

マトリックスの位置に名前が埋め込まれたコントロールがあるので、
ここでエラーチェックを行うことはできません。数値は常に整数であると想定しています...

    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);
            }
        } 
    } 
于 2012-07-05T23:24:00.700 に答える
1

このようなことを行うことができます(テキストボックスをラップする親コントロールがあると仮定します)。私の場合は、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);
 }      
于 2012-07-05T23:02:33.923 に答える
1

デザイナを使用して手動でテキストボックスをフォームに配置する代わりに、プログラムでテキストボックスを追加すると同時に、マトリックスに保存することができます。

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

(未検証。)

于 2012-07-05T23:22:49.617 に答える
0

テキストボックスを固定している(つまり、動的に作成していない)ので、フォーム定義に移動して、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;
                }
            }
        }

または、名前付き(あなたが言ったように):

            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;
                    }
                }
            }
于 2012-07-05T23:05:32.457 に答える
0

アレイを手動で作成するだけではいけませんか?

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

それは巧妙なトリックを実装していませんが、それは信じられないほど簡単で迅速です。また、使用を開始するとテキストボックスの数が変わる可能性は低いため、このようにハードコーディングしても問題はありません。

また、ジャグ配列[] []ではなく、正方形配列[、]を使用する必要があります。これは、ジャグ配列の長さが行ごとに異なる可能性があるためです。これは、行列では望ましくなく、正方形として宣言すると明確になります。

于 2012-07-05T23:25:45.993 に答える