AjaxControlToolkit - GridView не выберет - не понимаю состояние представления - PullRequest
1 голос
/ 30 января 2012

Обзор:

У меня есть два текстовых поля в верхней части этой формы для ввода даты начала / окончания.
В середине формы у меня есть вид сетки, который заполняется строками на основе этих дат.
Внизу формы у меня есть отчет, сгенерированный на основе выбранной строки в сетке.

Я выбрал BeginningDate и EndingDate, и представление сетки становится заполненным (работающим). Когда я нажимаю кнопку «Выбрать» в строке в сетке, происходит что-то, что заставляет ее сломаться. Строка не выбрана. Я знаю это, потому что CSS, который обычно применяется (по умолчанию) к выбранной строке в виде сетки, не применяется.

Дополнительно в коде позади я устанавливаю ...

lblGridError.Text = gridJobsReport.SelectedIndex.ToString()

Загрузка страницы даже имеет тот же код, поэтому метка читает «-1», когда страница загружается, но никогда не меняется, когда я нажимаю кнопки выбора в виде сетки. Что-то ломает мои асинхронные постбэки. Хотелось бы, чтобы я лучше понимал viewstate, я всегда подозреваю, что это виновник, но, честно говоря, понятия не имею.

<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="BidReport.aspx.vb" Inherits="BidReport" %>

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server"> 
    </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
            <ajaxToolkit:ToolkitScriptManager ID="tsmgrJobsReport" runat="server" 
                CombineScripts="True">
            </ajaxToolkit:ToolkitScriptManager>
        <p>
            Enter a date range to populate the Jobs Grid.</p>
        <asp:UpdatePanel ID="uPanelForm" runat="server">
            <ContentTemplate>
                <table>
                    <tr>
                        <td style="text-align: right">
                            <asp:Label ID="lblBeginningDate" runat="server" Text="Beginning Date:"></asp:Label></td>
                        <td>
                            <asp:TextBox ID="txtBeginningDate" runat="server" AutoPostBack="True" 
                                CausesValidation="True"></asp:TextBox>
                            <ajaxToolkit:CalendarExtender ID="txtBeginningDate_CalendarExtender" 
                                runat="server" 
                                TargetControlID="txtBeginningDate">
                            </ajaxToolkit:CalendarExtender>
                        </td>
                        <td>
                            <asp:RequiredFieldValidator ID="rfvBeginningdate" runat="server" 
                                ControlToValidate="txtBeginningDate" 
                                ErrorMessage="You must enter the Beginning Date" Font-Bold="True" 
                                ForeColor="Red">*</asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator ID="revBeginningDate" runat="server" 
                                ControlToValidate="txtBeginningDate" 
                                ErrorMessage="Posted Date must be in the format &quot;DD/MM/YYYY&quot;" 
                                Font-Bold="True" ForeColor="Red" 
                                ValidationExpression="^([1-9]|1[012])/([1-9]|[12][0-9]|3[01])/(20\d\d)$">*</asp:RegularExpressionValidator>
                        </td>
                        <td rowspan="2">
                            <asp:CompareValidator ID="cvBeginDateLTEndDate" runat="server" 
                                ControlToCompare="txtEndingDate" ControlToValidate="txtBeginningDate" 
                                ErrorMessage="Beginning Date must be earlier than the Ending Date." 
                                Font-Bold="True" ForeColor="Red" Operator="LessThan">*</asp:CompareValidator>
                        </td>
                    </tr>
                    <tr>
                        <td style="text-align: right">
                            <asp:Label ID="lblEndingDate" runat="server" Text="Ending Date:"></asp:Label></td>
                        <td>
                            <asp:TextBox ID="txtEndingDate" runat="server" AutoPostBack="True" 
                                CausesValidation="True"></asp:TextBox>

                            <ajaxToolkit:CalendarExtender ID="txtEndingDate_CalendarExtender" 
                                runat="server" TargetControlID="txtEndingDate">
                            </ajaxToolkit:CalendarExtender>
                        </td>
                        <td>
                            <asp:RequiredFieldValidator ID="rfvEndingDate" runat="server" 
                                ControlToValidate="txtEndingDate" 
                                ErrorMessage="You must enter the EndingDate Date" Font-Bold="True" 
                                ForeColor="Red">*</asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator ID="revEndingDate" runat="server" 
                                ControlToValidate="txtEndingDate" 
                                ErrorMessage="Posted Date must be in the format &quot;DD/MM/YYYY&quot;" 
                                Font-Bold="True" ForeColor="Red" 
                                ValidationExpression="^([1-9]|1[012])/([1-9]|[12][0-9]|3[01])/(20\d\d)$">*</asp:RegularExpressionValidator>
                        </td>
                    </tr>
                </table>
        <asp:ValidationSummary ID="valsumDates" runat="server" ForeColor="Red" />

        <p>Click or Tap the &quot;SELECT&quot; button in the right column next to the Job you want and 
            a report will be generated below.</p>

                <asp:GridView ID="gridJobsReport" runat="server" AutoGenerateColumns="False" 
                            CellPadding="4" DataKeyNames="PostingID" DataSourceID="sqlDSReportGrid" 
                            ForeColor="#333333" GridLines="Horizontal" 
                            ShowHeaderWhenEmpty="True" Width="100%">
                            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                            <Columns>
                                <asp:BoundField DataField="PostingID" HeaderText="PostingID" ReadOnly="True" 
                                    SortExpression="PostingID" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="Department" HeaderText="Department" 
                                    SortExpression="Department" />

                                <asp:BoundField DataField="JobName" HeaderText="JobName" 
                                    SortExpression="JobName" />

                                <asp:BoundField DataField="Shift" HeaderText="Shift" SortExpression="Shift" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="Needs" HeaderText="Needs" 
                                    SortExpression="Needs" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="PostedDate" HeaderText="PostedDate" 
                                    SortExpression="PostedDate" DataFormatString="{0:d}" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="PostedTime" HeaderText="Time" 
                                    SortExpression="PostedTime" DataFormatString="{0:t}" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="ClosingDate" HeaderText="ClosingDate" 
                                    SortExpression="ClosingDate" DataFormatString="{0:d}" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:BoundField DataField="ClosingTime" HeaderText="Time" 
                                    SortExpression="ClosingTime" DataFormatString="{0:t}" >
                                    <ItemStyle HorizontalAlign="Center" />
                                    </asp:BoundField>

                                <asp:CommandField ButtonType="Button" CausesValidation="True"
                                    ShowSelectButton="true" />
                            </Columns>
                            <EditRowStyle BackColor="#999999" />
                            <EmptyDataRowStyle HorizontalAlign="Center" />
                            <EmptyDataTemplate>
                                There is currently no data to display based on the date range provided.
                            </EmptyDataTemplate>
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <SortedAscendingCellStyle BackColor="#E9E7E2" />
                            <SortedAscendingHeaderStyle BackColor="#506C8C" />
                            <SortedDescendingCellStyle BackColor="#FFFDF8" />
                            <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                        </asp:GridView>
                        <br />
                    <asp:Label ID="lblGridError" runat="server"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
            <ajaxToolkit:UpdatePanelAnimationExtender ID="uPanelForm_UpdatePanelAnimationExtender" 
                runat="server" TargetControlID="uPanelForm">
            </ajaxToolkit:UpdatePanelAnimationExtender>
        <p>You can print or save the report using the buttons at the top of the report.</p>
        <asp:UpdatePanel ID="uPanelJobsReport" runat="server">
            <ContentTemplate>
                <rsweb:ReportViewer ID="rvJobsReport" runat="server" Width="100%">
                    </rsweb:ReportViewer>

            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="gridJobsReport" 
                    EventName="SelectedIndexChanged" />
            </Triggers>
        </asp:UpdatePanel>

        <asp:SqlDataSource ID="sqlDSReportGrid" runat="server" 
                ConnectionString="<%$ ConnectionStrings:JobsDB %>" 
                SelectCommand="SELECT dbo.tblJobPostings.PostingID, dbo.tblDepartments.Department, dbo.tblJobs.JobName, 
                                    dbo.tblJobPostings.Shift, dbo.tblJobPostings.Needs, dbo.tblJobPostings.PostedDate, 
                                    dbo.tblJobPostings.PostedTime, dbo.tblJobPostings.ClosingDate, dbo.tblJobPostings.ClosingTime 
                                FROM dbo.tblJobPostings 
                                    INNER JOIN dbo.tblJobs ON dbo.tblJobPostings.JobID = dbo.tblJobs.JobID 
                                    INNER JOIN dbo.tblDepartments ON dbo.tblJobPostings.DeptID = dbo.tblDepartments.DeptID 
                                WHERE dbo.tblJobPostings.ClosingDate &gt;= @BeginningDate 
                                    AND dbo.tblJobPostings.ClosingDate &lt;= @EndingDate 
                                ORDER BY dbo.tblJobPostings.ClosingDate Asc">
            <SelectParameters>
                <asp:ControlParameter ControlID="txtBeginningDate" Name="BeginningDate" 
                    PropertyName="Text" ConvertEmptyStringToNull="False" DefaultValue="" />
                <asp:ControlParameter ControlID="txtEndingDate" Name="EndingDate" 
                    PropertyName="Text" ConvertEmptyStringToNull="False" DefaultValue="" />
            </SelectParameters>
        </asp:SqlDataSource>

        <asp:SqlDataSource ID="sqlDSJobReport" runat="server"></asp:SqlDataSource>

</asp:Content>

1 Ответ

0 голосов
/ 01 февраля 2012

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

Я предполагаю, что после первоначального асинхронного обратного вызова sqldatasource не читалзначения в текстовых полях, или что-то.Если кто-нибудь сможет объяснить, что происходило в другом разделе «Ответ на вопрос», я приму это.

If Page.IsPostBack Then

    Session("sBeginningDate") = txtBeginningDate.Text
    Sessoin("sEndingDate") = txtEndingDate.Text

    txtBeginningDate.Text = Session("sBeginningdate")
    txtEndingDate.Text = Session("sEndingDate")

Else

    Session("sBeginningDate") = Now().AddDays(-14)
    Session("sEndingDate") = Now()

    txtBeginningDate.Text = Session("sBeginningDate").ToShortDateString
    txtEndingDate.Text = Session("sEndingDate").ToShortDateString

End If
...