C# и динамический список переключателей | Неверное значение радиокнопки при отправке

Вот мой код для загрузки rbl:

protected void rblContentTypesGetAll_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(Global.conString))
    {
        using (SqlCommand cmd = new SqlCommand("contentTypeGetAll", con))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(dt);
            }
        }
    }
    //Clear Items before reloading
    rblContentTypesGetAll.Items.Clear();

    //Populate Radio button list
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        rblContentTypesGetAll.Items.Add(new ListItem(dt.Rows[i]["contentType"].ToString() + " - " + dt.Rows[i]["description"].ToString(),
            dt.Rows[i]["ID"].ToString()));
    }

    //Set Default Selected Item by Value
    rblContentTypesGetAll.SelectedIndex = rblContentTypesGetAll.Items.IndexOf(rblContentTypesGetAll.Items.FindByValue(((siteParams)Session["myParams"]).DefaultContentType.ToLower()));

}

Вот HTML:

<asp:RadioButtonList id="rblContentTypesGetAll" OnLoad="rblContentTypesGetAll_Load"  runat="server">
</asp:RadioButtonList>

Вот форма, принимающая подачу:

 protected void Submit_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(Global.conString))
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("contentPageInsert", con))
        {
            cmd.Parameters.Add("@title", SqlDbType.VarChar).Value = Global.SafeSqlLiteral(txtPage.Text, 1);
            cmd.Parameters.Add("@contentTypeID", SqlDbType.VarChar).Value = rblContentTypesGetAll.SelectedValue;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
        con.Close();

        //Update Content Page Repeater
        using (SqlCommand cmd = new SqlCommand("contentPageGetAll", con))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(dt);
            }
        }
    }

    Session["formProcessed"] = "Page added!";
    Response.Redirect(redirectURL);
}

Независимо от того, какой переключатель я выбираю, значение всегда одно и то же — первый переключатель. Что я делаю неправильно?


person balexander    schedule 17.02.2011    source источник


Ответы (1)


Я думаю, причина в том, что метод, который заполняет список переключателей, очищается и перестраивается при каждой обратной передаче, поэтому к моменту срабатывания submit_click список перестраивается и выбор теряется. Попробуй это,

protected void rblContentTypesGetAll_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        return;
    }

    var dt = new DataTable();
    using (var con = new SqlConnection(Global.conString))
    using (var cmd = new SqlCommand("contentTypeGetAll", con))
    using (var da = new SqlDataAdapter(cmd))
    {
        da.Fill(dt);
    }
    //Clear Items before reloading
    rblContentTypesGetAll.Items.Clear();

    //Populate Radio button list
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        rblContentTypesGetAll.Items.Add(new ListItem(dt.Rows[i]["contentType"].ToString() + " - " + dt.Rows[i]["description"].ToString(),
            dt.Rows[i]["ID"].ToString()));
    }

    //Set Default Selected Item by Value
    rblContentTypesGetAll.SelectedIndex = rblContentTypesGetAll.Items.IndexOf(rblContentTypesGetAll.Items.FindByValue(((siteParams)Session["myParams"]).DefaultContentType.ToLower()));
}
person Bala R    schedule 17.02.2011
comment
Хотя ваше исправление звучало правильно, оно просто остановило привязку списка. Я пытался связать его, когда у меня есть форма, но это не сработало. - person balexander; 17.02.2011
comment
4guysfromrolla.com/webtech/072701-1.shtml Этой публикации 10 лет old и vb.net, но вы можете попробовать сделать что-то подобное, если приведенное выше предложение не помогло. - person Bala R; 17.02.2011
comment
StackOverflowException на 100% правильно. Вы должны убедиться, что метод rblContentTypesGetAll_Load вызывается только при первой загрузке страницы. Что-то еще происходит, если этот ответ не решает проблему. Кстати, посмотрите мое редактирование кода StackOverflowException, чтобы уменьшить вложенность. - person Metro Smurf; 17.02.2011
comment
Может быть, это потому, что форма загружается после нажатия кнопки linkButton, а список переключателей не загружается, потому что у меня есть !IsPostback? - person balexander; 18.02.2011