Обновление ASPX GridView с RadioButtonList не работает - PullRequest
0 голосов
/ 04 июля 2011

У меня есть страница ASPX с GridView, связанным с SqlDataSource, содержащим RadioButtonList в каждой строке:

<asp:GridView ID="gvwSomeGridView" runat="server" DataSourceID="sdsSomeDataSource">
    <Columns>
        <asp:TemplateField HeaderText="SomeHeader">
            <EditItemTemplate>
                <asp:RadioButtonList ID="rblSomeRBL" RepeatDirection="Horizontal" runat="server" SelectedValue='<%#(bool)Eval("SomeColumn") ? "1" : "0"%>'>
                    <asp:ListItem Text="ABC" Value="1" />
                    <asp:ListItem Text="XYZ" Value="0" />
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Literal runat="server" ID="lblSomeLabel" Text='<%#Convert.ToBoolean(Eval("SomeFolumn")) ? "SomeString" : "SomeOtherString" />
            </ItemTemplate>
    ....   

SqlDataSource имеет команду UpdateCommand, в которую я должен передать выбранный RadioButton, нок сожалению, я не могу заставить это работать:

<asp:SqlDataSource CancelSelectOnNullParameter="false" ConnectionString="..." ID="sdsSomeDataSource" runat="Server" UpdateCommand="UPDATE someTable SET someColumn = @SomeColumn" OnUpdating="OnSqlUpdating"

...

<UpdateParameters>
    <asp:ControlParameter Name="SomeColumn" ControlID="gvwSomeGridView$rblSomeRBL" PropertyName="SelectedValue" />
</UpdateParameters>

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

У меня действительно очень уродливое рабочее решение с присоединением к событию OnUpdatingSqlDataSource, а затем цикл по всем строкам GridView, чтобы найти строку, в которой элемент управления RadioButtonList не равен NULL (одна строка, которая обновляется), но я надеюсь, что есть более эффективный способ решения этой проблемы.

Редактировать

В соответствии с запросом уродливый код для OnSqlUpdating:

protected void OnSqlUpdating( object source, SqlDataSourceCommandEventArgs e )
{
    RadioButtonList radioButtonList = null;
    foreach( GridViewRow row in gvwSomeGridView.Rows )
    {
        if( row.FindControl( "rblSomeRBL" ) != null )
        {
            radioButtonList = row.FindControl( "rblSomeRBL" ) as RadioButtonList;
            break;
        }
    }

    if( radioButtonList != null )
    {
        int selectedValue = 0;
        if( Int32.TryParse( radioButtonList.SelectedValue, out selectedValue ) )
        {
            SqlParameter[] sqlParameters = new SqlParameter[ e.Command.Parameters.Count + 1 ];
            e.Command.Parameters.CopyTo( sqlParameter, 0 );
            sqlParameters[ sqlParameters.Length - 1 ] = new SqlParameter( "SomeColumn", SqlDbType.Bit )
            {
                Value = selectedValue
            }

            e.Command.Parameters.Clear();
            e.Command.Parameters.AddRange( sqlParameters );         
        }
    }
}

Заранее спасибо

G.

Ответы [ 2 ]

0 голосов
/ 18 октября 2016

Я только что узнал, что вы можете использовать событие RowUpdating gridview:

 <asp:Parameter Name="SomeColumn" Type="String" />

protected void gvwSomeGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

   GridViewRow row = gvwSomeGridView.Rows[e.RowIndex];

   RadioButtonList rblSomeRBL= row.Cells[0].Controls[0].FindControl("rblSomeRBL") as RadioButtonList;

   if (rblSomeRBL!= null)
   {
        sdsSomeDataSource.UpdateParameters["SomeColumn"].DefaultValue = rblSomeRBL.SelectedValue;
   }

    gvwSomeGridView.EditIndex = -1;
}
0 голосов
/ 06 июля 2011

Можете ли вы попытаться добавить UpdateParameter в SslDataSource следующим образом.

<UpdateParameters>
    <asp:ControlParameter ControlID = "rblSomeRBL" Name="SomeColumn" Type="String" PropertyName="SelectedValue" />
</UpdateParameters>
...