1

コード ビハインドで関連する関数をトリガーしないCheckbox_OnCheckedChangedとイベントの両方に問題があります。Dropdownlist_OnSelectedIndexChanged

両方の Control が a の値にバインドされますGridView。UI から発生した最初のOnCheckedChangedまたはイベントでは、コードビハインドの関数OnSelectedIndexChangedはエラーなしで発火しますUpdatePanel。が呼び出されますが、aが発生します。GridViewOnCheckedChangedOnSelectedIndexChangedPostBack

GridView代わりに呼び出される関数を再バインドする関数として、関数が呼び出されていないと思います。

 private void report_DateChanged(object sender, EventArgs e)
 {
        // Bind GridView here..
 }

しかし、なぜこれが起こるのか分かりません。

私はマスターページを持っています:

namespace ReportingSystemV2.Reporting
{
public partial class Reporting : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Attach to DateChanged Event on DateChange UserControl to Function
        DateRangeSelect.dateChanged += new DateRangeSelect.dateChangedEventHandler(dtRgSel_dateChanged);
    }

    // Declare an event for the content pages
    public event EventHandler reportDateChanged;

    // Called on a date change event
    protected void dtRgSel_dateChanged(object sender, DateChangedEventArgs e)
    {
        // Raise the event for content pages
        if (reportDateChanged != null)
            reportDateChanged(this, EventArgs.Empty);
    }
}

これMasterPageControl私の日付範囲を選択するためのものです..

ascx私の制御コードのコードの主なセクションは次のとおりです。

<%--UpdatePanel to trigger datechange--%>
<asp:UpdatePanel runat="server" ID="UpdatePanelDateChanged" OnLoad="UpdatePanelDateChanged_Load" >
</asp:UpdatePanel>

<%--When the date changes in javascript a postback is called in the updatepanel--%>
__doPostBack('<%=UpdatePanelDateChanged.ClientID %>', null);

このコントロールのコード ビハインドのメイン セクションは次のとおりです。

// Declare a delegate
public delegate void dateChangedEventHandler(object sender, DateChangedEventArgs e);

// Declare an event for any pages that have the control
public event dateChangedEventHandler dateChanged;

protected virtual void OnDateChanged(DateChangedEventArgs e)
{
    dateChangedEventHandler handler = dateChanged;

    // Raise the event
    if (handler != null)
        handler(this, e);
}

protected void UpdatePanelDateChanged_Load(object sender, EventArgs e)
{
   // Trigger the controls public event
   OnDateChanged(new DateChangedEventArgs(DateTime.Parse(dates[0]), DateTime.Parse(dates[1])));

}

私のコンテンツページでは、私のaspxコードは次のとおりです。

<%@ Page Title="Downtime" Language="C#" MasterPageFile="~/Reporting/Reporting.Master" AutoEventWireup="true" CodeBehind="GensetDowntime.aspx.cs" Inherits="ReportingSystemV2.Reporting.GensetDowntime" %>

<%@ MasterType VirtualPath="~/Reporting/Reporting.Master" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ReportingSubContent" runat="server">
<div class="container-fluid">
    <asp:UpdatePanel ID="updPanelDowntime" runat="server">
        <ContentTemplate>
            <div class="row">
                <div id="downtimeDiv" runat="server">
                    <asp:GridView ID="gridDowntime" runat="server" AutoGenerateColumns="False" GridLines="None" CssClass="table table-striped table-condensed"
                        OnRowDataBound="gridDowntime_RowDataBound"
                        OnSelectedIndexChanged="gridDowntime_SelectedIndexChanged"
                        DataKeyNames="ID,ID_Location,iddown,idup,dtdown,dtup,isexempt" EmptyDataText="No exempts in the selected period.">
                        <Columns>
                            <asp:TemplateField>
                                <ItemTemplate>
                            <asp:TemplateField HeaderText="Exempt?">
                                <ItemTemplate>
                                    <asp:DropDownList ID="ddlDowntimeExempt" AutoPostBack="true" runat="server"
                                        OnSelectedIndexChanged="ddlDowntimeExempt_SelectedIndexChanged">
                                        <asp:ListItem Value="-1">Unverified</asp:ListItem>
                                        <asp:ListItem Value="1">Yes</asp:ListItem>
                                        <asp:ListItem Value="0">No</asp:ListItem>
                                    </asp:DropDownList>
                                    <asp:Label ID="lblDowntimeExempt" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"isexempt")%>' Visible="false"></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Exclude?">
                                <ItemTemplate>
                                    <asp:CheckBox ID="chkDowntimeExclude" runat="server" Checked='<%#Convert.ToBoolean(Eval("ISEXCLUDED")) %>' OnCheckedChanged="chkDowntimeExclude_CheckedChanged" AutoPostBack="true"/>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:CommandField ShowSelectButton="True" SelectText="Details" />
                        </Columns>

                    </asp:GridView>
                </div>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
</asp:Content>

最後に、コンテンツ ページのコード ビハインドは次のとおりです。

    protected void Page_PreInit(object sender, EventArgs e)
    {
        // Attach to UserControl Event on the MasterPage
        Master.reportDateChanged += new EventHandler(report_DateChanged);
    }

    // If the user changes the date lets update the table
    private void report_DateChanged(object sender, EventArgs e)
    {
        // Bind the gridview
    }

    // Function to be called when the ddl selectedindex is changed, only called on initial page load
    protected void ddlDowntimeExempt_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Applies the values selected in the exempt DDL to the database value
    }

    // function to be called when the checkbox checked state is change, again only called on the initial page loading - not after a postback
    protected void chkDowntimeExclude_CheckedChanged(object sender, EventArgs e)
    {
        // When the Exclude checkbox is changed, update the Db
    }

上記のコードは、 の公開イベントである でJavaScriptcontrolを使用する をtrigger示しています。にはEvent に関連付けられた関数があり、この関数はいくつかの値を更新し、 my にアクセス可能な新しい Event をトリガーします。はこのイベントに関数をアタッチし、が変更されると、 のデータをロードしてバインドします。PostBackUpdatePaneltriggersControlMasterPageControlMasterPageContentPageContentPageMasterPageDateRangeGridView

4

3 に答える 3

0

非同期ポストバック トリガーが欠落していると思います。更新パネルが部分的にポストバックする場合、ページ全体を送り返し、処理を行ってから、変更された部分のみを返します。おそらくその過程で、わずかな ID の変更が行われ、登録漏れが発生しています。report_DateChanged実装するページの最初のコントロールであるため、おそらく発生します(チェックボックスとドロップダウンのIPostBackEventHandlerポストバックが機能しなくなったため)

これを解決するには、非同期ポストバックを実行する各コントロールを更新パネルのトリガーに明示的に追加します。このような:

protected void gridDowntime_RowDataBound(object sender, GridViewRowEventArgs e)  
{  
    DropDownList ddl = e.Row.FindControl("ddlDowntimeExempt") as DropDownList;  
    CheckBox cb = e.Row.FindControl("chkDowntimeExclude") as CheckBox;  
    ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(ddl);  
    ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(cb);  
}  
于 2016-02-19T06:55:25.603 に答える
0

Problem solved, by modifying the code in my DateRangeControl the UpdatePanel is no longer being triggered on all PostBacks, only those where it is called by __doPostBack('<%=UpdatePanelDateChanged.ClientID %>', null); in my Javascript.

protected void UpdatePanelDateChanged_Load(object sender, EventArgs e)
{
    if (Request["__EVENTTARGET"] == UpdatePanelDateChanged.ClientID)
    {

        //Trigger Event
        OnDateChanged(new DateChangedEventArgs(DateTime.Parse(dates[0]), DateTime.Parse(dates[1])));

    }
}

Solution reference: http://encosia.com/are-you-making-these-3-common-aspnet-ajax-mistakes/

于 2016-02-19T15:53:11.663 に答える
0

マスター ページは、「子」ページのコントロールの先頭に追加の名前を追加します。ほとんどの場合、ドロップダウンに名前があることを期待していますが、ctrl1$something$dropdown のような別の長い名前になります。

Chrome または開発ツールで検査を使用して ida をチェックし、これが最初に問題であることを確認します。

于 2016-02-19T02:49:06.403 に答える