如何将值从文本框复制到标签数组?

时间:2012-01-06 21:36:18

标签: c# arrays textbox labels

OK这是我所做的,并且垂直设置的值将复制到标签中但水平。并且只有一列/行。

public partial class Form1 : Form
{
    private Label l;
    private Button bStart;
    private TextBox txtVnes;
    private Label[] pole;

    public Form1()
    {
        InitializeComponent();
        bStart = new Button();
        bStart.Location = new Point(240, 165);
        bStart.Width = 75;
        bStart.Height = 25;
        bStart.Text = "START";

        txtVnes = new TextBox();
        txtVnes.Location = new Point(240, 10);
        txtVnes.Width = 160;
        txtVnes.Height = 130;
        txtVnes.Multiline = true;

        int a = 0;
        pole = new Label[42];
        for (int i = 1; i <= 6; i++)
        {
            for (int j = 1; j <= 7; j++)
            {
                l = new Label();
                l.Name = "label" + i.ToString() + j.ToString();
                l.Text = "Z";
                l.Width = 20;
                l.Height = 20;
                l.TextAlign = ContentAlignment.MiddleCenter;
                l.Parent = this;
                l.BackColor = Color.FromArgb(100, 149, 237);
                l.Location = new Point(10 + (j - 1) * 25, 15 + (i - 1) * 25);
                pole[a] = l;
                this.Controls.Add(l);
                a++;

            }
        }

        this.Controls.Add(bStart);
        this.Controls.Add(txtVnes);

        bStart.Click += new EventHandler(bStart_Click);

    }


    private void bStart_Click(object sender, EventArgs e)
    {

        Regex regex = new Regex(@"^(\s)*(\d ){6}\d(\s)*$");
        bool isValid = true;
        string[] ts = txtVnes.Text.Split(new string[] { "\r\n" },
        StringSplitOptions.RemoveEmptyEntries);


        if (ts == null || ts.Length < 1 || ts.Length > 6)
        {
            MessageBox.Show("Not valid");
        }
        else
        {
            foreach (string t in ts)
            {
                if (regex.IsMatch(t) == false)
                {
                    MessageBox.Show("Not valid");
                    break;
                }
            }

        }

        if (isValid)
        {

            for (int i = 0; i < 6; i++)
            {
                if (i < ts.Length && regex.IsMatch(ts[i]))
                { 

                    pole[i].Text = ts[i];
                }
                else
                {
                    pole[i].Text = "not valid";
                }
            }

        }
    }

Here's a photo

所以这就是问题所在:当我点击按钮bStart时,只复制一个值并从标签数组中替换为一个labe。 这应该是这样的:在用户点击按钮bStart之后,文本框txtVnes中的所有值都应该复制到标签数组中的每个标签中。所有标签都有文本“Z”,点击按钮后,应使用文本框txtVnes中的值更改它们。正如您所看到的,我使用l.Text = txtVnes.Text;来复制值,但它不起作用。如果你能帮助我,我感激不尽,谢谢!

1 个答案:

答案 0 :(得分:0)

您始终设置相同标签l的文字。由于您的标签位于数组pole中,因此您应将文本设置为连续的pole索引。

我想要开头的所有有效文本:

string[] ts = txtVnes.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
int k = 0;
for (int i = 0; i < ts.Length && k < 6; i++) {
    if (IsValid(ts[i])) { // Where IsValid is a method containing your validation logic.
        pole[k++].Text = ts[i];
    }
}

// Fill remaining labels
for (int i = k; i < 6; i++) {
    pole[i].Text = "not valid";
}

或者,如果你想混合使用vaild和无效文本:

string[] ts = txtVnes.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < 6; i++) {
    if (i < ts.Length && IsValid(ts[i])) { // Where IsValid is a method containing your validation logic.
        pole[i].Text = ts[i];
    } else {
        pole[i].Text = "not valid";
    }
}

请注意,数组索引从0开始,而不是从1开始。


编辑#2:

IsValid方法如下所示:

private static Regex regex = new Regex(@"^(\s)*(\d ){6}\d(\s)*$"); 

private static bool IsValid(string s)
{
    return regex.IsMatch(s);
}

要在评论中回答您的问题:是的,我上面的示例必须放在bStart_Click中。

表单构造函数中还有另一个错误。 this.Controls.Add(l);应放在内部for循环中,紧跟在pole[a] = l;之后,否则表单上只会显示一个标签。

最后,在实施并分析了您的代码之后,我得出的结论是,您希望能够将以下格式的文本输入到文本框中,然后将数字放入相应的标签中:

1 2 3 4 5 6 7
2 3 4 6 7 8 0
0 1 2 6 6 6 7
1 2 3 4 5 6 7
2 3 4 6 7 8 0
0 1 2 6 6 6 7

完整代码应如下所示:

public partial class Form1 : Form
{
    private Button bStart;
    private TextBox txtVnes;
    private Label[] pole;

    public Form1()
    {
        InitializeComponent();
        bStart = new Button();
        bStart.Location = new Point(240, 165);
        bStart.Width = 75;
        bStart.Height = 25;
        bStart.Text = "START";
        bStart.Click += new EventHandler(bStart_Click);
        this.Controls.Add(bStart);

        txtVnes = new TextBox();
        txtVnes.Location = new Point(240, 10);
        txtVnes.Width = 160;
        txtVnes.Height = 130;
        txtVnes.Multiline = true;
        this.Controls.Add(txtVnes);

        int a = 0;
        pole = new Label[42];
        for (int i = 1; i <= 6; i++) {
            for (int j = 1; j <= 7; j++) {
                var l = new Label();
                l.Name = "label" + i.ToString() + j.ToString();
                l.Text = "Z";
                l.Width = 20;
                l.Height = 20;
                l.TextAlign = ContentAlignment.MiddleCenter;
                l.Parent = this;
                l.BackColor = Color.FromArgb(100, 149, 237);
                l.Location = new Point(10 + (j - 1) * 25, 15 + (i - 1) * 25);
                pole[a] = l;
                this.Controls.Add(l);
                a++;
            }
        }
    }

    private void bStart_Click(object sender, EventArgs e)
    {
        string[] ts = txtVnes.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
        int row = 0;
        for (int i = 0; i < ts.Length && row < 6; i++) {
            if (LineIsValid(ts[i])) {
                for (int col = 0; col < 7; col++) {
                    pole[row * 7 + col].Text = ts[i][2 * col].ToString();
                }
                row++;
            }
        }

        // Fill remaining labels
        for (; row < 6; row++) {
            for (int col = 0; col < 7; col++) {
                pole[row * 7 + col].Text = "Z";
            }
        }
    }

    private static Regex regex = new Regex(@"^(\s)*(\d ){6}\d(\s)*$");

    private static bool LineIsValid(string line)
    {
        return regex.IsMatch(line);
    }
}

bStart_Click中还需要两个嵌套循环。一行用于行,一行用于列。