UpdatePanel 有时不更新数据。有时会有很长的延迟

UpdatePanel does not update data, some of the time. Sometimes there are long delays

我有一个 UpdatePanel,里面有另一个 Panel 来模拟一个简单的弹出窗口 window。

Panel里面我有一个HTMLTable,有几行几列,一个GridView在一行,一个DetailsView再往下。

在 HTML table 侧还有一个提交和一个取消按钮。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:PostBackTrigger ControlID="ButtonSubmit" />
        <asp:PostBackTrigger ControlID="ButtonCancel" />
    </Triggers>
    <ContentTemplate>
        <asp:Panel ID="pnlRoomDetails" runat="server" CssClass="pnlDetail" Visible="false" Width="500px">
            <table id="tblDetails" runat="server" style="width: 100%">
                <tr style="height:26px;">
                    <td colspan="6" style="font-size: 12pt; color: yellow; font-family: Arial; background-color: blue;
                        text-align: center" valign="middle">
                        <strong>Room Allocation</strong></td>
                </tr>
                <tr>
                    <td colspan="1" style="text-align: left; vertical-align: middle; width: 128px; height: 24px;" valign="top">
                        <strong>
                        Room ID</strong></td>
                    <td colspan="3" style="width: 357px; text-align: left; vertical-align: middle; height: 24px;">
                        <asp:Label ID="lblRoomID" runat="server" Text="Label" Font-Bold="true"></asp:Label></td>
                    <td colspan="1" style="vertical-align: middle; width: 106px; height: 24px; text-align: left">
                        <strong>
                        Available?</strong></td>
                    <td colspan="1" style="vertical-align: middle; width: 120px; height: 24px; text-align: left">
                        <asp:CheckBox ID="cbStatus" runat="server" Width="98px" Enabled="False" /></td>
                </tr>
                <tr>
                    <td colspan="1" style="text-align: left; vertical-align: middle; width: 128px; height: 24px;" valign="top">
                        <strong>
                        Name</strong></td>
                    <td colspan="3" style="width: 357px; text-align: left; vertical-align: middle; height: 24px;">
                        <asp:Label ID="lblRoomName" runat="server" Text="Label"></asp:Label></td>
                    <td colspan="1" style="vertical-align: middle; width: 106px; height: 24px; text-align: left">
                        <strong>
                        Configuration</strong></td>
                    <td colspan="1" style="vertical-align: middle; width: 120px; height: 24px; text-align: left">
                        <asp:Label ID="lblRoomConfigName" runat="server" Text="Label"></asp:Label></td>
                </tr>
                <tr>
                    <td colspan="1" style="vertical-align: middle; width: 128px; height: 24px; text-align: left"
                        valign="top">
                        <strong>Max Beds</strong></td>
                    <td colspan="3" style="vertical-align: middle; width: 357px; height: 24px; text-align: left">
                        <asp:Label ID="lblBeds" runat="server" Text="Label"></asp:Label></td>
                    <td colspan="1" style="vertical-align: middle; width: 106px; height: 24px; text-align: left">
                    </td>
                    <td colspan="1" style="vertical-align: middle; width: 120px; height: 24px; text-align: left">
                    </td>
                </tr>
                <tr>
                    <td colspan="1" style="vertical-align: middle; width: 128px; height: 24px; text-align: left"
                        valign="top">
                        <strong>Room Comments</strong></td>
                    <td colspan="5" style="vertical-align: middle; height: 24px; text-align: left">
                        <asp:TextBox ID="tbComments" runat="server" Enabled="False" Height="47px" MaxLength="8"
                            ReadOnly="True" Style="text-align: left" TextMode="MultiLine" Width="98%"></asp:TextBox></td>
                </tr>
                <tr>
                    <td colspan="6">
                        <asp:Label ID="lblMsg" runat="server" Visible="False" Width="100%" BackColor="Red" Font-Bold="True" Font-Names="Arial" ForeColor="Yellow" style="text-align:center"></asp:Label>
                        <asp:GridView ID="gvAllocations" runat="server" AllowSorting="True" CellPadding="4"
                            ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" Font-Names="Arial Narrow" Font-Size="10pt"
                            DataSourceID="sdsAllocations" DataKeyNames="BoardingCheckinID" 
                            OnRowDataBound="gvAllocations_RowDataBound" 
                            OnDataBound="gvAllocations_DataBound">
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                            <Columns>
                                <asp:TemplateField HeaderText="Tenant" SortExpression="TenantName">
                                    <ItemTemplate>
                                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("TenantName") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Left" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="ID" SortExpression="TenantID">
                                    <ItemTemplate>
                                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("TenantID") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Bed" SortExpression="BedName">
                                    <ItemTemplate>
                                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("BedName") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Checked IN" SortExpression="DateCheckedIn">
                                    <ItemTemplate>
                                        <asp:Label ID="lblDateCheckIn" runat="server" Text='<%# Eval("DateCheckedIn","{0:g}") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Right" />
                                </asp:TemplateField>
                                <asp:TemplateField Visible="false" ShowHeader="false">
                                    <ItemTemplate>
                                        <asp:Label ID="lblCheckedInBy" runat="server" Text='<%# Eval("CheckedInBy") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Expected Check Out" SortExpression="ExpectedCheckOut">
                                    <ItemTemplate>
                                        <asp:Label ID="Label6" runat="server" Text='<%# Eval("ExpectedCheckOut","{0:g}") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Right" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Notes" SortExpression="Notes">
                                    <ItemTemplate>
                                        <asp:Label ID="Label7" runat="server" Text='<%# Eval("Notes") %>'></asp:Label>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Left" />
                                </asp:TemplateField>
                                <asp:TemplateField ShowHeader="False">
                                    <ItemTemplate>
                                        <asp:LinkButton ID="lnkDEL" runat="server" CausesValidation="False" CommandName="Delete" Text="DEL" OnClientClick="return confirm('Are you sure?');"></asp:LinkButton>
                                    </ItemTemplate>
                                </asp:TemplateField>
                            </Columns>
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <EditRowStyle BackColor="#999999" />
                            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                        </asp:GridView>
                        <asp:SqlDataSource ID="sdsAllocations" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>" CancelSelectOnNullParameter="False"
                            SelectCommand="SELECT bc.BoardingCheckinID, bc.BoardingRoomID, ISNULL(bc.TenantID, bc.StudentID) AS TenantID, v1.StudentPreferredName + ' ' + v1.StudentFamilyName AS TenantName, bc.BedID, bb.BedName, bc.BoardingTypeID, brt.TypeName, bc.DateCheckedIn, bc.CheckedINby, bc.ExpectedCheckOut, bc.Notes FROM tblBoardingCheckins AS bc INNER JOIN vwBoardingTenants AS v1 ON v1.StudentID = bc.StudentID AND v1.Year = YEAR(GETDATE()) INNER JOIN tblBoardingBeds AS bb ON bb.BedID
= bc.BedID INNER JOIN tblBoardingRooms AS br ON br.BoardingRoomID = bc.BoardingRoomID INNER JOIN tblBoardingRoomTypes AS brt ON brt.BoardingTypeID = bc.BoardingTypeID WHERE (bc.IsActive = 1) AND (bc.DateCheckedIn <= GETDATE()) AND (bc.ExpectedCheckOut >= GETDATE()) AND (bc.BoardingRoomID = @RoomID) ORDER BY bc.DateCheckedIn DESC"
                            DeleteCommand="UPDATE tblBoardingCheckins SET IsActive = 0 WHERE BoardingCheckinID = @BoardingCheckinID">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="lblSelectedRoomID" Name="RoomID" />
                            </SelectParameters>
                            <DeleteParameters>
                                <asp:Parameter Name="BoardingCheckinID" />
                            </DeleteParameters>
                        </asp:SqlDataSource>
                    </td>
                </tr>
                <tr>
                    <td colspan="6">
                        <asp:DetailsView ID="dvRoomCheckIn" runat="server" AutoGenerateRows="False" DefaultMode="Insert" CellPadding="3"
                            Width="100%" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" OnDataBound="dvRoomCheckIn_DataBound">
                            <FooterStyle BackColor="White" ForeColor="#000066" />
                            <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
                            <Fields>
                                <asp:BoundField DataField="BoardingBookingID" ReadOnly="True" Visible="False" />
                                <asp:TemplateField HeaderText="Pick Student">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="ddlTenant" runat="server" DataSourceID="sdsTenants" DataTextField="StudentName" DataValueField="StudentID" AppendDataBoundItems="true">
                                            <asp:ListItem Selected="True" Text="Please select.." Value="0"></asp:ListItem>
                                        </asp:DropDownList>
                                        <asp:SqlDataSource ID="sdsTenants" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                                            SelectCommand="WITH cte AS (SELECT CASE WHEN bc.StudentID IS NULL THEN v1.StudentID ELSE NULL END AS StudentID, CASE WHEN bc.StudentID IS NULL THEN (v1.StudentPreferredName + ' ' + v1.StudentFamilyName) ELSE NULL END AS StudentName FROM vwBoardingTenants AS v1 LEFT OUTER JOIN tblBoardingCheckins AS bc ON v1.StudentID = bc.StudentID AND bc.DateCheckedIn <= GETDATE() AND bc.ExpectedCheckOut >= GETDATE() AND bc.IsActive = 1 WHERE (v1.Boarding = 'Y') AND (v1.Year = YEAR(GETDATE()))) SELECT StudentID, StudentName FROM cte AS cte_1 WHERE (StudentID IS NOT NULL) ORDER BY StudentName">
                                        </asp:SqlDataSource>
                                        <asp:RequiredFieldValidator ID="rfvTenant" runat="server" ControlToValidate="ddlTenant" ErrorMessage="Required" InitialValue="0" ValidationGroup="vg1"></asp:RequiredFieldValidator>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Choose Bed">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="ddlBeds" runat="server" DataSourceID="sdsBeds" DataTextField="BedName" DataValueField="BedID" OnDataBound="ddlBeds_DataBound">
                                            <asp:ListItem Selected="True" Text="Select.." Value=""></asp:ListItem>
                                        </asp:DropDownList>
                                        <asp:SqlDataSource ID="sdsBeds" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                                            SelectCommand="SELECT BedID, BedName FROM tblBoardingBeds WHERE BedID <= @BedMax ORDER BY BedName">
                                            <SelectParameters>
                                                <asp:ControlParameter ControlID="lblBeds" Name="BedMax" Type="Int16" />
                                            </SelectParameters>
                                        </asp:SqlDataSource>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Check IN">
                                    <ItemTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td>
                                                    <asp:Label ID="lblCheckedIN" runat="server" Text='<%# Eval("DateCheckedIn","{0:g}") %>' Width="70%"></asp:Label>
                                                </td>
                                                <td>
                                                    <strong style="text-align: center">BY</strong>
                                                </td>
                                                <td>
                                                    <asp:Label ID="lblCheckedINby" runat="server" Text='<%# Eval("CheckedINby") %>' Enabled="false"></asp:Label>
                                                </td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Check OUT by">
                                    <ItemTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td>
                                                    <asp:TextBox ID="txtCheckOUT" runat="server" Text='<%# Bind("ExpectedCheckOut") %>' Width="80"></asp:TextBox>
                                                    <asp:ImageButton runat="Server" ID="calImg" ImageUrl="~/images/Calendar_scheduleHS.png" AlternateText="Click to show calendar" CausesValidation="False" />
                                                    <ajaxToolkit:CalendarExtender PopupButtonID="calImg" Enabled="true" TargetControlID="txtCheckOUT" ID="ce1" runat="server" Format="d/MM/yyyy" PopupPosition="TopRight"></ajaxToolkit:CalendarExtender>
                                                    <asp:RequiredFieldValidator SetFocusOnError="true" ValidationGroup="vg1" ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtCheckOUT" ErrorMessage="Date is required">*</asp:RequiredFieldValidator>
                                                    <asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="txtCheckOUT" Operator="DataTypeCheck" Type="Date" Display="Dynamic" ErrorMessage="Invalid Date (d/M/yyyy)" SetFocusOnError="True"></asp:CompareValidator>
                                                    <asp:CompareValidator ID="CompareValidator2" runat="server" ControlToValidate="txtCheckOUT" Operator="GreaterThan" Type="Date" Display="Dynamic" ValueToCompare='<%# DateTime.Today.ToShortDateString() %>' ErrorMessage="Check out date must be greater than Checked IN date!" SetFocusOnError="True"></asp:CompareValidator>
                                                </td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Comments" SortExpression="Notes">
                                    <ItemTemplate>
                                        <asp:TextBox ID="txtNotes" runat="server" Text='<%# Bind("Notes") %>' Width="98%" Rows="5" TextMode="MultiLine"></asp:TextBox>
                                    </ItemTemplate>
                                </asp:TemplateField>
                            </Fields>
                            <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
                            <EditRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
                            <RowStyle ForeColor="#000066" />
                        </asp:DetailsView>
                    </td>
                </tr>
                <tr>
                    <td colspan="6" style="text-align: center">
                        <asp:Button ID="ButtonSubmit" runat="server" Text="Submit" OnClick="Submit_Click" CausesValidation="true" ValidationGroup="vg1" />
    <%--
                        <input id="ButtonSubmit" runat="server" value="Submit" type="button" validationgroup="vg1" onserverclick="Submit_Click" causesvalidation="true" />
                        <input id="ButtonSubmit" runat="server" type="button" value="Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('ButtonSubmit', '', true, 'vg1', '', false, false))"/>
    --%>
                        <asp:Button ID="ButtonCancel" runat="server" Text="Cancel" OnClick="Cancel_Click" CausesValidation="false"/>
                    </td>
                </tr>
            </table>
        </asp:Panel>
    </ContentTemplate> </asp:UpdatePanel>

提交按钮触发此代码...

protected void Submit_Click(object sender, EventArgs e)
{
    //find button used to get here
    Button btnRoomClicked = (Button)pnlRoomDetails.FindControl("Room" + lblSelectedRoomID.Text);
    if (btnRoomClicked != null)
    {
        //reset colours
        btnRoomClicked.Font.Bold = false;
    }

    //Check In!
    using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ATCNTV1ConnectionString"].ConnectionString))
    {
        cnn.Open();

        try
        {
            //prepare command
            using (SqlCommand cmd = new SqlCommand("spBoardingCheckIN", cnn))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                DropDownList ddlTenant = (DropDownList)dvRoomCheckIn.FindControl("ddlTenant");
                if (ddlTenant != null) cmd.Parameters.Add("@StudentID", SqlDbType.Char).Value = ddlTenant.SelectedValue.ToString();

                cmd.Parameters.Add("@TenantID", SqlDbType.VarChar).Value = string.Empty;

                DropDownList ddlBed = (DropDownList)dvRoomCheckIn.FindControl("ddlBeds");
                if (ddlBed != null) cmd.Parameters.Add("@BedID", SqlDbType.Int).Value = ddlBed.SelectedValue.ToString();

                cmd.Parameters.Add("@BoardingRoomID", SqlDbType.Int).Value = lblSelectedRoomID.Text;
                cmd.Parameters.Add("@BoardingTypeID", SqlDbType.Int).Value = 2;   //Boarder types only at this stage
                cmd.Parameters.Add("@StaffID", SqlDbType.VarChar).Value = (Session["StaffID"] != string.Empty) ? Session["StaffID"].ToString() : "0000000001";  //default to Admin if null

                TextBox txtCheckOUT = (TextBox)dvRoomCheckIn.FindControl("txtCheckOUT");
                if (txtCheckOUT != null) cmd.Parameters.Add("@ExpectedCheckOut", SqlDbType.DateTime).Value = DateTime.Parse(txtCheckOUT.Text);

                TextBox txtNotes = (TextBox)dvRoomCheckIn.FindControl("txtNotes");
                if (txtNotes != null) cmd.Parameters.Add("@Notes", SqlDbType.VarChar).Value = txtNotes.Text;

                //run query
                int tst = cmd.ExecuteNonQuery();
                if (tst != 1) throw new Exception("The Insert command did not work! tst=" + tst.ToString() + " ");
            }
        }
        catch (Exception ex)
        {
            lblMsg.Text = ex.Message + " - " + ex.StackTrace;
        }

        //re-enable main panel and hide details panel
        pnlRoomDetails.Visible = false;
        pnlMAIN.Enabled = true;
        gvCurrCheckIns.DataBind();

        //update the motel layout
        MotelFormat();
    }
}

问题是,每当我将新租户提交到 GridView gvAllocations 时,有时服务器会执行回发,有时它什么也不做,并且刷新页面时不会在 Gridview 中显示新条目.但是,在后一种情况下,页面会在大约 15-20 秒后正确刷新,我可以看到新租户已添加到 GridView 中。其他时候,它会立即发生。

我已经用它并排测试了 SQL 服务器,INSERT 正在工作,我可以立即看到新行,但由于某种原因 ASP.net 页面确实不注册这个,但只有在 15-20 秒后。正如我所说,这种情况 有时会发生 ,这更令人沮丧。

奇怪的是,每当我从 gvAllocations GridView 中删除一个租户时,整个过程都完美无缺。

我不确定这里的问题是否出在 UpdatePanel 上,或者这可能是我的设计不佳,我应该为整个事情使用 FormView。可以在 UpdatePanel 中包含 FormView 吗?我什至需要更新面板吗?

我读过 this,添加 ScriptManager RegisterPostBackControl() 对我来说没有任何改变。

顺便提一下,提交按钮呈现如下...

<input type="submit" name="ctl00$ContentPlaceHolder1$ButtonSubmit" value="Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$ButtonSubmit&quot;, &quot;&quot;, true, &quot;vg1&quot;, &quot;&quot;, false, false))" id="ctl00_ContentPlaceHolder1_ButtonSubmit">

取消按钮没有WebForm_DoPostBackWithOptions()。为什么?

感谢您的宝贵时间。

看来没人能帮我解决这个问题,我正要悬赏,但我找到了罪魁祸首!

是的 - 你猜对了 - 参数嗅探!我花了 4 天时间才弄明白。

dvRoomCheckInDetailsView我自己预先设计了三个参数到控件中,在上面的代码中可以看到——参数分别是DateCheckedIn、CheckedINby、和 ExpectedCheckOut。

存储过程是这样的...

CREATE PROCEDURE [dbo].[spBoardingCheckIN]
    @StudentID CHAR(10),
    @TenantID VARCHAR(20) = NULL,
    @BedID INT,
    @BoardingRoomID INT,
    @BoardingTypeID INT,
    @StaffID VARCHAR(10),
    @ExpectedCheckOut DATETIME,
    @Notes VARCHAR(5000)
AS
BEGIN
    INSERT INTO tblBoardingCheckins(StudentID,
                                    TenantID,
                                    BedID,
                                    BoardingRoomID,
                                    BoardingTypeID,
                                    DateCheckedIn,
                                    CheckedINby,
                                    ExpectedCheckOut,
                                    Notes,
                                    IsActive)
    VALUES (@StudentID,
            @TenantID,
            @BedID,
            @BoardingRoomID,
            @BoardingTypeID,
            GETDATE(),
            @StaffID,
            CONVERT(DATETIME, @ExpectedCheckOut, 121),
            @Notes,
            1)
END
GO

所以发生的事情是因为我没有在存储过程中指定这三个参数(我已经默认了值并且只提到了其中一个),ASP.net(或SQL服务器?)去查找我在 DetailsView 中提到的其他两个参数的值。

我修复它的方法是指定 ASP.net 预期的所有参数,因此我更改了 ASP.net 中的存储过程和参数列表以反映预期的确切参数数量,以避免程序针对这些值进入 "sniffing" 模式。

CREATE PROCEDURE [dbo].[spBoardingCheckIN]
    @StudentID CHAR(10),
    @TenantID VARCHAR(20) = NULL,
    @BedID INT,
    @BoardingRoomID INT,
    @BoardingTypeID INT,
    @DateCheckedIn DATETIME,
    @CheckedINby VARCHAR(10),
    @ExpectedCheckOut DATETIME,
    @Notes VARCHAR(5000)
AS
BEGIN
    INSERT INTO tblBoardingCheckins(StudentID,
                                    TenantID,
                                    BedID,
                                    BoardingRoomID,
                                    BoardingTypeID,
                                    DateCheckedIn,
                                    CheckedINby,
                                    ExpectedCheckOut,
                                    Notes,
                                    IsActive)
    VALUES (@StudentID,
            @TenantID,
            @BedID,
            @BoardingRoomID,
            @BoardingTypeID,
            @DateCheckedIn,
            @CheckedINby,
            CONVERT(DATETIME, @ExpectedCheckOut, 121),
            @Notes,
            1)
END
GO

因此 ASP.net 中的 SqlDataSource 是 ...

<asp:SqlDataSource ID="sdsCheckinEntries" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                        InsertCommand="spBoardingCheckIN" InsertCommandType="StoredProcedure" EnableCaching="false">
                        <InsertParameters>
                            <asp:ControlParameter ControlID="dvRoomCheckIn$ddlTenant" Name="StudentID" Type="string" />
                            <asp:Parameter Name="TenantID" Type="string" DefaultValue="" ConvertEmptyStringToNull="true" />
                            <asp:ControlParameter ControlID="dvRoomCheckIn$ddlBeds" Name="BedID" Type="int16" />
                            <asp:ControlParameter ControlID="lblSelectedRoomID" Name="BoardingRoomID" Type="Int16" />
                            <asp:Parameter Name="BoardingTypeID" Type="int16" DefaultValue="2" />
                            <asp:ControlParameter ControlID="dvRoomCheckIn$lblCheckedIN" Name="DateCheckedIn" Type="DateTime" />
                            <asp:ControlParameter ControlID="dvRoomCheckIn$lblCheckedINby" Name="CheckedINby" Type="string" />
                            <asp:ControlParameter ControlID="dvRoomCheckIn$txtCheckOUT" Name="ExpectedCheckOut" Type="DateTime" />
                            <asp:ControlParameter ControlID="dvRoomCheckIn$txtNotes" Name="Notes" Type="String" />
                        </InsertParameters>
                    </asp:SqlDataSource>

所以是的,吸取了教训!不要仅仅因为参数存在于控件中就认为它会自动直接链接到数据源。有时,程序可能不会 "find it" 并且必须去寻找与缺少的参数相关的值。

一个很好的资源 - 如果不是我迄今为止找到的最好的资源是 this。它解释了一切。

我希望这能帮助其他人拔头发!

干杯