2016-02-18 45 views
1

我有一个问题,既Checkbox_OnCheckedChangedDropdownlist_OnSelectedIndexChanged事件没有触发我的代码后面的相关功能。C#ASP.NET CheckBox_OnCheckedChanged没有按预期发射

两个控件都绑定到GridView中的值。在从UI引发的第一个OnCheckedChangedOnSelectedIndexChanged事件中,代码中的函数无误地触发,但是,如果我刷新我的UpdatePanel,例如通过更改GridView中的数据的日期范围并因此加载更多或更少的记录,则OnCheckedChangedOnSelectedIndexChanged函数不再被调用,但发生了PostBack

我相信作为重新绑定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); 
    } 
} 

MasterPage具有选择我的日期范围内Control ..

的代码为我控制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 
    } 

上面的代码表明,使用JavaScript来triggercontrol一个PostBackUpdatePanel,其中triggersControl公开事件。 MasterPage具有附加到Control事件的功能,该MasterPage函数会更新一些值并触发可访问我的ContentPage的新事件。 ContentPage将一个函数附加到此MasterPage事件中,并且在更改DateRange时,它将加载GridView的数据并对其进行绑定。

+0

我们想欣赏你的努力,但不是很多人有时间去阅读整个问题。请发布小程序或代码*(尽可能小)*,以便我们可以复制该问题。在制作小代码时,您甚至可以自己找到解决方案。 – Win

+0

我已更新我的代码并尽可能减少它,希望这可以被接受。谢谢 – neilrudds

回答

0

问题解决了,在我的DateRangeControlUpdatePanel修改代码不再被触发所有PostBacks,只有那些它是由__doPostBack('<%=UpdatePanelDateChanged.ClientID %>', null);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]))); 

    } 
} 

解决方案参考:http://encosia.com/are-you-making-these-3-common-aspnet-ajax-mistakes/

0

母版页在“子”页面的控件的开头追加了额外的名称。很可能你期望的下拉列表有一个名字,但它会有一个不同的更长的像ctrl1 $ something $ dropdown。

使用Chrome或开发工具中的inspect来检查ida,以确认这是您的第一个问题。

+0

我用开发工具进行了检查,当复选框正常工作时,名称是:'ctl00 $ ctl00 $ MainContent $ ReportingSubContent $ gridDowntime $ ctl02 $ chkDowntimeExclude',当它打破它时'ctl00 $ ctl00 $ MainContent $ ReportingSubContent $ gridDowntime $ ctl14 $ chkDowntimeExclude'这里改变的唯一项目是ctl02到ctl14,这是因为CheckBox在GridView中的记录下面。 – neilrudds

0

我想你错过了异步回发触发器。当更新面板部分回传时,它会发回整个页面,执行处理,然后仅返回已更改的部分。在这个过程中,可能会发生轻微的身份证件更改,然后会发生注册错误。该report_DateChanged是最有可能解雇了,因为它是实现IPostBackEventHandler(因为复选框和下拉回传不工作了)的页面

第一控制要解决的是,明确添加应该做的每一个控制异步回发到更新面板的触发器。像这样:

​​
+0

我已经按照您的建议添加了异步回发注册,但是这没有效果。行为与以前相同? – neilrudds

+0

奇怪的是,如果您将Master_page_load中的'DateRangeSelect.dateChanged'移动到'Page_PreInit',是否会改变行为? – Balah

+0

通过移动此行为改变,因为当我更改日期并且GridView数据没有更改时,我的主控中的'dtRgSel_dateChanged'函数不再被调用。 – neilrudds