Заполнять метки в цикле

#c# #asp.net #loops #label

#c# #asp.net #циклы #метка

Вопрос:

У меня есть 5 меток с названиями lblQuestion1, lblQuestion2, lblQuestion3… и как часть цикла ниже, когда i = 0, я хочу lblQuestion1.Text = reader[«ответ1»].toString(); …

i=1 —> lblQuestion2.Text = reader[«ответ1»].toString(); …

i=2 —> lblQuestion3.Text = reader[«ответ1»].toString(); ……

Однако это не работает, поэтому может кто-нибудь предложить альтернативный метод.

     for (int i = 0; i < 5; i  )
    {
        try
        {
            conn.Open();

            string cmdText = "SELECT * FROM questions ORDER BY RAND() LIMIT 1";
            MySqlCommand cmd = new MySqlCommand(cmdText, conn);

            reader = cmd.ExecuteReader();

            if (reader.Read())
            {
                if (!(list.Contains(reader["question_id"].ToString())))
                {
                    list.Add(reader["question_id"].ToString());
                    //lblQuestion[i 1].Text = reader["answer1"].ToString();
                }
            }
            else
            {
                lblError.Text = "(no questions found)";
            }
            reader.Close();
        }
        catch
        {
            lblError.Text = "Database connection error - failed to insert record.";
        }
        finally
        {
            conn.Close();
        }
    }
  

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

1. где вы устанавливаете текст метки??

2. @EhsanSajjad Я хочу установить его там, где я написал комментарий //lblQuestion[i 1]. Text = reader[«ответ1»]. toString();

3. что такое lblQuestion[], где это определено?

4. @EhsanSajjad Ничего и нигде. Я пытаюсь задать текст lblQuestion1, lblQuestion2, lblQuestion3, lblQuestion4, lblQuestion5, но я не уверен, как это сделать.

5. вы можете сделать это таким образом: lblQuestion1.Text = reader["answer1"].ToString();

Ответ №1:

Вы можете поместить ссылки на метки в массив и получить к ним доступ с помощью этого. Я поместил пять меток в форму (оставив их имена по умолчанию) и использовал этот код в качестве примера:

 private void SetLabelsText()
{
    // Put references to the labels in an array
    Label[] labelsArray = { label1, label2, label3, label4, label5 };
    for (int i = 0; i < labelsArray.Count(); i  )
    {
        labelsArray[i].Text = "I am label "   (i   1).ToString();
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    SetLabelsText();
}
  

Ответ №2:

Чтобы ответить на ваш комментарий к моему комментарию. Поскольку FindControl в качестве входных данных используется строка, вы бы просто создали строку с именем компонента, который вы ищете. Имейте в виду, что вы должны использовать метод FindControl контейнера, в котором находятся ваши метки.

По ссылке (выделено мной):

Используйте FindControl для доступа к элементу управления из функции на странице, находящейся за кодом, для доступа к элементу управления, который находится внутри другого контейнера, или в других обстоятельствах, когда целевой элемент управления недоступен напрямую вызывающему. Этот метод найдет элемент управления, только если элемент управления непосредственно содержится в указанном контейнере; то есть метод не выполняет поиск по всей иерархии элементов управления внутри элементов управления. Информацию о том, как найти элемент управления, если вы не знаете его непосредственный контейнер, см. в разделе Как: Доступ к элементам управления сервера по идентификатору.

итак, что-то подобное должно сработать для вас.

  ((Label) this.FindControl("lblQuestion"   (i 1))).Text = reader["answer"   (i 1)].ToString();