У меня есть страница 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.