Как вывести столбец DataGrid в метки?

#c# #winforms #datagridview #datagrid #label

#c# #winforms #datagridview #datagrid #метка

Вопрос:

Я просто пытаюсь вывести столбец элемента управления DataGridView. Первый код, как показано ниже, создает метки и добавляет их в список и форму, все хорошо. Но 2-й, он не работает. Как я могу выводить в метки?

     public List<Label> labels;
    private void cmdBot_Click(object sender, EventArgs e)
    {
        labels = new List<Label>();

        for (int i = 0; i <= dataGridView1.RowCount; i  )
        {
            Label gecoLabel = new Label();
            gecoLabel.Text = "test label";
            gecoLabel.AutoSize = true;
            gecoLabel.Location = new Point(100, 10 * i);
            groupBox1.Controls.Add(gecoLabel);

            labels.Add(gecoLabel);
        }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < dataGridView1.RowCount; i  )
        {
            foreach (Label testLabel in labels)
            {
                testLabel.Text = dataGridView1.Rows[i].Cells["link"].FormattedValue.ToString();
            }
        }
    }
 

Комментарии:

1. Почему это помечено [wpf] ? — этот код не WPF, это winforms.

2. мисс клик, извините за это.

Ответ №1:

Похоже, у вас есть дополнительный цикл во второй функции, который приведет к тому, что каждая метка будет установлена ДЛЯ КАЖДОЙ СТРОКИ из DataGrid. Но, поскольку вы не сказали точно, как это не работает, мое единственное предположение относительно того, что вам может понадобиться, это (обратите внимание, что второй метод преобразуется в 1 дополнительную строку в первом методе, но вам не обязательно делать это таким образом, если вы не хотите):

 private void cmdBot_Click(object sender, EventArgs e)
{
    labels = new List<Label>();

    for (int i = 0; i <= dataGridView1.RowCount; i  )
    {
        Label gecoLabel = new Label();
        //**Since you're already looping through every row, why not just set the label text at the same time?
        gecoLabel.Text = dataGridView1.Rows[i].Cells["link"].FormattedValue.ToString();
        gecoLabel.AutoSize = true;
        gecoLabel.Location = new Point(100, 10 * i);
        groupBox1.Controls.Add(gecoLabel);

        labels.Add(gecoLabel);
    }
 

РЕДАКТИРОВАТЬ: как говорит @Dmitri E, вам также необходимо назначить идентификатор для каждой метки.

Комментарии:

1. Да, этот код работает. Все разные строки переходят к разным меткам. Но при использовании моего кода только последняя строка DataGrid переходит ко всем меткам. Для этого мне нужно использовать 2-ю функцию, в любом случае спасибо

2. Вы присвоили каждой метке уникальный идентификатор? Вы могли бы добавить точку останова или какой-нибудь отладочный материал MessageBox, который сообщает вам, сколько меток у вас в конечном итоге в вашей коллекции, и при необходимости перебирает их…

3. Нет, я этого не делал, и я не хочу этого делать, потому что у каждой метки есть события. и есть много меток, которые, по-моему, используют одну и ту же функцию события.

4. Нет никакого способа избежать необходимости присваивать значения идентификаторов, но если вы пытались избежать кучи дополнительных всплывающих окон отладки, почему бы вам просто не выполнить этот метод с помощью отладчика? Или у вас могут быть локальные переменные (например, int для количества меток и List<string> для текстовых значений), а затем отображать их в вашем пользовательском интерфейсе (только для целей тестирования / отладки).

Ответ №2:

 Label gecoLabel = new Label();
gecoLabel.Text = "test label";
gecoLabel.ID = "lbl"   i.ToString();
 

Добавьте эту строку в первый цикл. (каждая метка ДОЛЖНА иметь идентификатор)
Затем вы можете перебирать свои метки, находить подходящую метку и обновлять ее свойство text

Комментарии:

1. Я уже знаю это, но мне нужно использовать свой путь, если это возможно.

Ответ №3:

Вы должны изменить свой второй код следующим образом :

 for (int i = 0; i < dataGridView1.RowCount; i  )
{
            labels[i].Text = dataGridView1.Rows[i].Cells["link"].FormattedValue.ToString();
}
 

Вы вводите два цикла и последнюю строку настройки значения сетки для текста меток.