GridView的奇怪问题,一个ObjectDataSource和一个组中的两个RadioButtons

时间:2011-09-04 16:27:11

标签: asp.net ajaxcontroltoolkit

我遇到一个非常奇怪的问题,一个是GridView,一个ObjectDataSource和一个组中的两个RadioButtons。几周后查看实时代码和简化示例,我找不到解决方案。我认为它可能是ASP.Net中的一个错误,所以想知道是否有人遇到过类似的东西?感激地收到任何意见或建议 - 我已经尝试了我能想到的一切。

GridView的EnableViewState设置为false,这会导致Select和Count方法被调用两次 - 一次,以便GridView可以在回发之前计算出它的状态,并且一次可以获得新数据显示。 (在这种情况下,GridView不执行CRUD操作,因此调用Select和Count方法两次是不需要的行为,但我找不到任何阻止它的方法。)

页面上控件的值使用select参数传递给ObjectDataSource(这些参数用于选择要显示的数据)。

当第二次调用count和select时,所有值总是正确的。但是,当它进行第一次调用时,包含文本框内容的参数始终是正确的,但作为组的一部分的RadioButton的参数是错误的。这会导致返回错误的计数,从而影响分页。该问题似乎只影响组中的RadioButton - 当未指定组时,它们正常工作。

从简化示例中,这里是文本框,导致回发的按钮和单选按钮:

<asp:TextBox ID="txtSearch" runat="server" 
              Width="160px" Height="23px"></asp:TextBox>
&nbsp;
<asp:TextBox ID="txtSearch2" runat="server" 
             Width="160px" Height="23px"></asp:TextBox>
&nbsp;
<asp:Button ID="cmdGo" runat="server" Width="75px" Height="24px" Text="Find!" 
            EnableViewState="true"></asp:Button>
&nbsp;

<div class="OptionGroupSpacer">-</div>
    <div class="OptionGroup">
        <asp:RadioButton ID="Option1" runat="server" Text="Option1" 
                         GroupName="Group1" EnableViewState="true" />
        <asp:RadioButton ID="Option2" runat="server" GroupName="Group1"
                         Text="Option2" EnableViewState="true" /></div>

带有选择参数的ObjectdataSource:

<asp:ObjectDataSource ID="EntriesDataSource" runat="server" 
                      TypeName="Dictionary.clsEntryDAL"
                      SortParameterName="SortExpression" 
                      SelectMethod="SelectEntries" EnablePaging="True"
                      SelectCountMethod="Count" EnableViewState="true"  >
    <SelectParameters>
        <asp:ControlParameter ControlID="txtSearch" Name="txtSearch" 
                              PropertyName="Text" Type="String" />
        <asp:ControlParameter ControlID="txtSearch2" Name="txtSearch2" 
                              PropertyName="Text" Type="String" />
        <asp:ControlParameter ControlID="Option1" Name="Option1" 
                              PropertyName="Checked" Type="Boolean" />
        <asp:ControlParameter ControlID="Option2" Name="Option2" 
                              PropertyName="Checked" Type="Boolean" />
    </SelectParameters>
</asp:ObjectDataSource>

GridView(包含来自ASP.Net AJAX Control Toolkit的评级控件。)

<asp:GridView ID="grdEntriesNew" runat="server" AllowPaging="True" CellPadding="4"
  DataSourceID="EntriesDataSource" AutoGenerateColumns="False" Visible="true" CssClass="Entries"
  BorderStyle="None" GridLines="None" ShowHeader="false" EnableViewState="false">
  <RowStyle CssClass="Row" />
  <AlternatingRowStyle CssClass="AlternatingRow" />
  <Columns>
  <asp:BoundField DataField="NewLayout" DataFormatString="{0}" HtmlEncode="false" Visible="true" />
    <asp:TemplateField ControlStyle-Width="52px" ItemStyle-Width="52px" ItemStyle-VerticalAlign="Top">
      <ItemTemplate>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <ContentTemplate>
            <ajaxToolkit:Rating runat="server" ID="DynamicRating1" CurrentRating='<%# Bind("Votes") %>'
              MaxRating="3" CssClass="ratingStar" StarCssClass="ratingItem" WaitingStarCssClass="Saved"
              FilledStarCssClass="Filled" EmptyStarCssClass="Empty" AutoPostBack="False" Width="42px"
              Enabled="False" ReadOnly="True" Tag='<%# Bind("ID") %>' BorderStyle="None" ToolTip="Please vote"
              BorderWidth="3px" EnableViewState="true">
            </ajaxToolkit:Rating>
          </ContentTemplate>
        </asp:UpdatePanel>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="EditLink" DataFormatString="{0}" HtmlEncode="false" Visible="true" ItemStyle-Width="30px">
<ItemStyle Width="30px"></ItemStyle>
    </asp:BoundField>
  </Columns>
</asp:GridView>

这会导致计数和选择方法

Public Function count(ByVal txtSearch As String, _
                      ByVal txtSearch2 As String, _
                      ByVal Option1 As Boolean, _
                      ByVal Option2 As Boolean, _
                      ByVal CurrentUserID As Integer) As Integer

...

Public Function SelectEntries(ByVal txtSearch As String, _
                              ByVal txtSearch2 As String, _
                              ByVal Option1 As Boolean, _
                              ByVal Option2 As Boolean, _
                              ByVal maximumRows As Integer, _
                              ByVal startRowIndex As Integer, _
                              ByVal SortExpression As String, _
                              ByVal CurrentUserID As Integer) As IList(Of clsEntryShort) 

...

在第一次搜索完成时调用一次,在每次后续搜索时调用两次。

在后续搜索中,第一次调用count和select方法时,从文本框读取的txtSearch和txtSearch2字符串值始终是正确的,但从RadioButtons读取的Option1和Option2布尔值是错误的。

只有当RadioButton在一个组中时才会出现问题 - 而不是当他们不在一个组中时。文本框始终完美无缺。

GridView包含ASP.Net AJAX控件,它们与GridView数据绑定到相同的数据 - 如果这些控件不存在,则Select和Count方法不会被调用两次。

只有在GridView的EnableViewState设置为false时才会出现问题(在此应用程序中不能简单地将EnableViewState设置为true,因为这会导致生成非常大的ViewState,从而导致性能问题)。

DropDownList控件似乎也存在这个问题,但我没有详细研究它们。

感激地收到任何想法!

谢谢!

0 个答案:

没有答案