Как скопировать значения из текстового поля в массив меток? - PullRequest
0 голосов
/ 07 января 2012

ОК. Вот что я сделал, и значения, которые были заданы по вертикали, копируются в метки, но по горизонтали.И только один столбец / строка.

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

        }
    }

Вот фотография

Так вот в чем проблема: Когда я нажимаю на кнопку bStart, только одно значение копируется и заменяется в одном лабе из массиваэтикеток.Это должно работать следующим образом: после того, как пользователь нажмет кнопку bStart, все значения из текстового поля txtVnes должны быть скопированы в каждую метку в массиве меток.Все метки имеют текст «Z», и после нажатия на кнопку они должны быть изменены со значениями в текстовом поле txtVnes.Как видите, я использовал l.Text = txtVnes.Text; для копирования значений, но это не работает.Я ценю, если вы можете мне помочь, спасибо!

1 Ответ

0 голосов
/ 07 января 2012

Вы всегда устанавливаете текст одной и той же метки 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 также требуются два вложенных цикла.Один для строк и один для столбцов.

...