【问题标题】:ASP.Net C# - Access dynamically generated List controlsASP.Net C# - 访问动态生成的列表控件
【发布时间】:2014-07-16 03:08:32
【问题描述】:

根据数据库中字段“type”的值,我想生成 CheckBoxList(如果“type”为 C)或 RadioButtonList(如果“type”为 R),然后相应地填充它们。我已经设法创建了必要的控件,但是,在 populateAnswers 方法中,我不确定如何访问新创建的控件。您可以从下面的代码中看到我已经尝试过

((CheckBoxList)this.FindControl("cblAnswers"))

但这不起作用。任何帮助将不胜感激。

代码:

protected void Button1_Click(object sender, EventArgs e)
{
    string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    MySqlConnection conn = new MySqlConnection(connStr);
    MySqlDataReader reader;

    List<string> listOfAnswerIDs = new List<string>();
    List<string> listOfAnswers = new List<string>();
    List<string> listOfCorrectAnswerIDs = new List<string>();

    try
    {
        conn.Open();
        string cmdText = "SELECT * FROM questions_m WHERE question_id=1";
        MySqlCommand cmd = new MySqlCommand(cmdText, conn);

        reader = cmd.ExecuteReader();

        if (reader.Read())
        {
            lblQuestion.Text = reader["question"].ToString();

            if (reader["type"].ToString().Equals("C"))
            {
                CheckBoxList cblAnswers = new CheckBoxList();
                Page.Form.Controls.Add(cblAnswers);
            }
            else if (reader["type"].ToString().Equals("R"))
            {
                 RadioButtonList rblAnswers = new RadioButtonList();
                 Page.Form.Controls.Add(rblAnswers);
            }

            ViewState["QuestionID"] = reader["question_id"].ToString();
            reader.Close();

            string cmdText2 = "SELECT * FROM answers_m WHERE question_id=1";
            MySqlCommand cmdAnswers = new MySqlCommand(cmdText2, conn);
            reader = cmdAnswers.ExecuteReader();

            while (reader.Read())
            {
                listOfAnswerIDs.Add(reader["answer_id"].ToString());
                listOfAnswers.Add(reader["answer"].ToString());
                if (reader["correct"].ToString().Equals("Y"))
                {
                    listOfCorrectAnswerIDs.Add(reader["answer_id"].ToString());
                }
            }

            reader.Close();
            populateAnswers(listOfAnswers, listOfAnswerIDs);

        }
        else
        {
            reader.Close();
            lblError.Text = "(no questions found)";
        }
        ViewState["listOfCorrectAnswerIDs"] = listOfCorrectAnswerIDs;

    }
    catch
    {
        lblError.Text = "Database connection error - failed to read records.";
    }
    finally
    {
        conn.Close();
    }
}

private void populateAnswers(List<string> listOfAnswers, List<string> listOfAnswerIDs)
{
    Random ran = new Random(Guid.NewGuid().GetHashCode());
    var numbers = Enumerable.Range(1, listOfAnswers.Count).OrderBy(j => ran.Next()).ToList();

    List<ListItem> ans = new List<ListItem>();
    for (int i = 0; i < listOfAnswers.Count; i++)
    {
        ans.Add(new ListItem(listOfAnswers[i].ToString(), listOfAnswerIDs[i].ToString()));
    }

    foreach (int num in numbers)
    {
        ((CheckBoxList)this.FindControl("cblAnswers")).Items.Add(ans[num - 1]);
    }
}

【问题讨论】:

    标签: c# asp.net controls asp.net-controls


    【解决方案1】:

    当您创建 CheckBoxList 或 RadioButtonList 时,请尝试给它们一个 ID。当您使用 FindControl() 时,它会查找具有您传递给它的特定 ID 的控件。

    CheckBoxList cblAnswers = new CheckBoxList();
    cblAnswers.ID = "cblAnswers";
    Page.Form.Controls.Add(cblAnswers);
    
    RadioButtonList rblAnswers = new RadioButtonList();
    rblAnswers.ID = "rblAnswers";
    Page.Form.Controls.Add(rblAnswers);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多