событие списка радиокнопок не срабатывает все время

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

<asp:RadioButtonList runat="server" ID="rblShowRecords" AutoPostBack="true" 
OnSelectedIndexChanged="rblShowRecords_SelectedIndexChanged" RepeatDirection="Horizontal">
    <asp:ListItem >Show Active/Completed</asp:ListItem>
    <asp:ListItem >Show Active</asp:ListItem>
    <asp:ListItem >Show Completed</asp:ListItem>
</asp:RadioButtonList>  

Вот метод события:

protected void rblShowRecords_SelectedIndexChanged(object sender, EventArgs e)
    {

        switch (rblShowRecords.SelectedItem.Text)
        {
            case "Show Active/Completed":
                CEDatabaseSource.SelectCommand = ConfigurationManager.AppSettings["SelectAllRecords"].ToString();//"SELECT * FROM [CERecord] ORDER BY [Priority]";
                break;
            case "Show Active":
                CEDatabaseSource.SelectCommand = ConfigurationManager.AppSettings["SelectActiveRecords"].ToString();
                break;
            case "Show Completed":
                CEDatabaseSource.SelectCommand = ConfigurationManager.AppSettings["SelectCompletedRecords"].ToString();
                break;
            default:
                break;
        }
        CEDatabaseSource.DataBind(); //Commit the changes to the data source.
        gvRecordList.DataBind(); //Update the GridView
        rblShowRecords.SelectedItem.Value = CEDatabaseSource.SelectCommand; //Update the value of the selected radio button with the selected SELECT command.
    }

Я не понимаю, почему он работает только 3 раза, но после этого он никогда не входит в метод выше.

Попытка сделать то же самое, но с раскрывающимся списком, также работает 3 раза, а затем эта ошибка:

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation

person sd_dracula    schedule 17.03.2013    source источник
comment
Когда вы устанавливаете значение для элемента в последней строке кода, вы пытаетесь установить для SQL-запроса значение элемента, и SQL-запрос может содержать символы, которые вызовут недопустимую обратную передачу. Вы уже знаете, какую команду выбора извлекать на основе текста, так почему вы пытаетесь установить запрос выбора в раскрывающийся список?   -  person rs.    schedule 17.03.2013
comment
Ну, selected.item.text - это то, что вы видите в DDL, а selected.item.value - это строковый запрос sql, сохраненный в файле конфигурации. Но почему он работает 3 раза, а потом выходит из строя?   -  person sd_dracula    schedule 17.03.2013
comment
Да, но почему вы устанавливаете его на Selected.item.Value? И у вас может быть один запрос, который содержит символы типа > или <, которые являются недопустимыми контрольными значениями и вызовут недопустимую обратную передачу   -  person rs.    schedule 17.03.2013
comment
В основном мне нужно сделать это в page_load if (IsPostBack) { CEDatabaseSource.SelectCommand = ddlShowRecords.SelectedValue; CEDatabaseSource.DataBind(); }, иначе, когда у меня есть определенное представление и я нажимаю строку, чтобы отредактировать ее, gridview вызывает команду выбора по умолчанию и все портит.   -  person sd_dracula    schedule 17.03.2013


Ответы (1)


Основываясь на вашем последнем комментарии, удалите код, который устанавливает SQL-запросы в SelectedItem.Value, и используйте свойство SelectedItem.Text для получения команды, когда она вам нужна, запросы select могут содержать такие символы, как >, < и т. Д., Что приведет к недопустимой ошибке обратной передачи, вы можете изменить свой код на следующий:

string GetCommand()
{
    switch (rblShowRecords.SelectedItem.Text)
    {
        case "Show Active/Completed":
            return ConfigurationManager.AppSettings["SelectAllRecords"].ToString();
        case "Show Active":
            return  ConfigurationManager.AppSettings["SelectActiveRecords"].ToString();
        case "Show Completed":
            return  ConfigurationManager.AppSettings["SelectCompletedRecords"].ToString();
        default:
            return "";
    }
}

В Page_Load

if (IsPostBack) 
{ 
    CEDatabaseSource.SelectCommand = GetCommand();
    CEDatabaseSource.DataBind(); 
}

Теперь ваш код SelectedIndexChanged будет

protected void rblShowRecords_SelectedIndexChanged(object sender, EventArgs e)
{
    CEDatabaseSource.SelectCommand = GetCommand();
    CEDatabaseSource.DataBind(); //Commit the changes to the data source.
    gvRecordList.DataBind(); //Update the GridView
}
person rs.    schedule 17.03.2013