2016-08-27 12 views
0

여기에서 찾은 모든 제안을 시도해 보았습니다. EnableViewState를 true 및 false로 설정했습니다. EnableViewState를 true 및 false로 설정했습니다. 상위 그리드 RowCreated에 자식 그리드에 대한 이벤트를 등록하려고했습니다. 나는 진실로 상실감에 처해있다. 이 작업을 어떻게 수행합니까? 부모 또는 자녀 이벤트가 실행되지 않습니다.ASP.Net 중첩 된 GridView OnRowCommand가 실행되지 않음

<%@ Control Language="C#" EnableViewState="False" AutoEventWireup="False" CodeBehind="View.ascx.cs" Inherits="IMS.Modules.CreateMerchandise.View" %> 


<asp:GridView ID="gvVariants" 
       runat="server" 
       AutoGenerateColumns="False" 
       CssClass="Grid" 
       DataKeyNames="ID" 
       OnRowDataBound="gvVariants_OnRowDataBound" 
       ShowFooter="True" 
       EnableViewState="False" 
       OnRowCreated="gvVariants_OnRowCreated" 
       OnRowCommand="gvVariants_OnRowCommand"> 
    <Columns> 
     <asp:TemplateField InsertVisible="False"> 
      <ItemStyle HorizontalAlign="Center" Width="30"/> 
      <ItemTemplate> 
       <img alt="" style="cursor: pointer; height: 20px; width: 20px;" src="../images/ManageMerchandise/plus.png"/> 
       <asp:Panel ID="pnlValues" runat="server" Style="display: none" EnableViewState="False"> 
        <asp:GridView 
         ID="gvValues" 
         runat="server" 
         AutoGenerateColumns="False" 
         CssClass="ChildGrid" 
         DataKeyNames="ID" 
         ShowFooter="True" 
         EnableViewState="False" 
         OnRowCommand="gvValues_OnRowCommand"> 
         <Columns> 
          <asp:TemplateField ItemStyle-Width="15px"> 
           <FooterTemplate> 
            <asp:Button runat="server" text="Add" ID="btnAddValue" CommandName="AddValue" CommandArgument='<%# Bind("ID") %>'/> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField 
           HeaderText="Value" 
           InsertVisible="True" 
           ItemStyle-Width="150px"> 
           <ItemTemplate> 
            <asp:Label ID="lblValue" runat="server" 
               Text='<%# Bind("VariantValue") %>'> 
            </asp:Label> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="NewValue" runat="server" Width="150"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Use"> 
           <ItemTemplate> 
            <asp:CheckBox ID="cbUseVariantValue" runat="server" 
                Enabled="true"/> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:CheckBox ID="cbUseNewVariantValue" runat="server"/> 
           </FooterTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 
       </asp:Panel> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:Button runat="server" text="Add" ID="btnAddVariant" CommandName="addVariant" CommandArgument='<%# Bind("ID") %>'/> 
      </FooterTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Variant" InsertVisible="True"> 
      <ItemTemplate> 
       <asp:Label ID="lblVarietal" runat="server" 
          Text='<%# Bind("Name") %>'> 
       </asp:Label> 
      </ItemTemplate> 
      <ItemStyle HorizontalAlign="Center" Width="240"/> 
      <FooterTemplate> 
       <asp:TextBox ID="NewVariant" runat="server"></asp:TextBox> 
      </FooterTemplate> 
      <FooterStyle Wrap="False"/> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Use"> 
      <ItemTemplate> 
       <asp:CheckBox ID="cbUseVariant" runat="server" 
           Enabled="true"/> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:CheckBox ID="cbUseNewVariant" runat="server"/> 
      </FooterTemplate> 
      <ItemStyle HorizontalAlign="Center"/> 
      <FooterStyle HorizontalAlign="Center"/> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView>OnLoad: 

의 OnLoad : 코드 숨김에서

protected override void OnLoad(EventArgs e) 
{ 
     try 
     { 
      base.OnLoad(e); 
      if (!IsPostBack) 
      { 
       gvVariants.DataSource = GetVariantTable(); 
       gvVariants.DataBind(); 
      } 
     } 
     catch (Exception exc) //Module failed to load 
     { 
      DotNetNuke.Services.Exceptions.Exceptions.ProcessModuleLoadException(this, exc); 
     } 

    } 

RowDataBound :

protected void gvVariants_OnRowDataBound(Object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     {   
      String variantId= gvVariants.DataKeys[e.Row.RowIndex].Value.ToString(); 

      GridView gvValues = e.Row.FindControl("gvValues") as GridView; 
      using (var ipv = new IMM_ProductVariantValuesController()) 
      { 
       ipv.Gets(variantId,"IMM_ProductVariants_ID",pWhere: $"and (portal_id=-1 or portal_id={PortalId})"); 
       ipv.LoadDatatable(); 
       gvValues.DataSource = ipv.Datatable; 
       gvValues.DataBind(); 
      } 
     }  
    } 

    protected void gvVariants_OnRowCommand(Object sender, GridViewCommandEventArgs e) 
    { 
     Response.Write("got here"); 
     Response.End(); 
    } 
+0

당신이 gvVariants''에 데이터를 바인딩 할 수 있습니까? 'Page_Load'에 있다면,'if (! IsPostBack)'조건 블록 내에서 처리해야합니다. – ConnorsFan

+0

그게 내가 가진거야 – Chris

답변

0

그리고 이것은 지금 작동합니다

<%@ Control Language="C#" EnableViewState="False" ViewStateMode="Disabled" AutoEventWireup="False" CodeBehind="View.ascx.cs" Inherits="IMS.Modules.CreateMerchandise.View" %> 

<style type="text/css"> 
    body { 
     font-family: Arial; 
     font-size: 10pt; 
    } 

    .Grid td { 
     background-color: #A1DCF2; 
     color: black; 
     font-size: 10pt; 
     line-height: 200% 
    } 

    .Grid th { 
     background-color: #3AC0F2; 
     color: White; 
     font-size: 10pt; 
     line-height: 200% 
    } 

    .ChildGrid td { 
     background-color: #eee !important; 
     color: black; 
     font-size: 10pt; 
     line-height: 200% 
    } 

    .ChildGrid th { 
     background-color: #6C6C6C !important; 
     color: White; 
     font-size: 10pt; 
     line-height: 200% 
    } 
</style> 


<script type="text/javascript"> 

    function SetID(id) { 
     document.getElementById("hfVariantID").value = id; 
    } 

    $("[src*=plus]") 
     .live("click", 
      function() { 
       $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>"); 
       $(this).attr("src", "../images/ManageMerchandise/minus.png"); 
      }); 
    $("[src*=minus]") 
     .live("click", 
      function() { 
       $(this).attr("src", "../images/ManageMerchandise/plus.png"); 
       $(this).closest("tr").next().remove(); 
      }); 
</script> 
<asp:UpdatePanel runat="server" ID="upVariants" UpdateMode="Conditional" ViewStateMode="Disabled" EnableViewState="False"> 
<ContentTemplate> 
<asp:GridView ID="gvVariants" runat="server" AutoGenerateColumns="False" CssClass="Grid" DataKeyNames="ID" OnRowDataBound="gvVariants_OnRowDataBound" ShowFooter="True" EnableViewState="False" OnRowCommand="gvVariants_OnRowCommand"> 
    <Columns> 
     <asp:TemplateField InsertVisible="False"> 
      <ItemStyle HorizontalAlign="Center" Width="30"/> 
      <ItemTemplate> 
       <img alt="" style="cursor: pointer; height: 20px; width: 20px;" src="../images/ManageMerchandise/plus.png"/> 
       <asp:Panel ID="pnlValues" runat="server" Style="display: none" EnableViewState="False"> 
        <asp:GridView ID="gvValues" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvValues_OnRowDataBound" CssClass="ChildGrid" DataKeyNames="ID" ShowFooter="True" EnableViewState="False"> 
         <Columns> 
          <asp:BoundField DataField="ID" Visible="False"/> 
          <asp:TemplateField ItemStyle-Width="15px"> 
           <FooterTemplate> 
            <asp:Button runat="server" text="Add" ID="btnAddValue" OnClick="btnAddValue_Click" CommandName="AddValue" CommandArgument='<%# Bind("ID") %>'/> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField 
           HeaderText="Value" 
           InsertVisible="True" 
           ItemStyle-Width="150px"> 
           <ItemTemplate> 
            <asp:Label ID="lblValue" runat="server" 
               Text='<%# Bind("VariantValue") %>'> 
            </asp:Label> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:TextBox ID="NewValue" runat="server" Width="150"></asp:TextBox> 
           </FooterTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Use"> 
           <ItemTemplate> 
            <asp:CheckBox ID="cbUseVariantValue" runat="server" 
                Enabled="true"/> 
           </ItemTemplate> 
           <FooterTemplate> 
            <asp:CheckBox ID="cbUseNewVariantValue" runat="server"/> 
           </FooterTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 
       </asp:Panel> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:Button runat="server" text="Add" ID="btnAddVariant" CommandName="addVariant" OnClick="btnAddVariant_Click" CommandArgument='<%# Bind("ID") %>'/> 
      </FooterTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Variant"> 
      <ItemTemplate> 
       <asp:Label ID="lblVarietal" runat="server" 
          Text='<%# Bind("Name") %>'> 
       </asp:Label> 
      </ItemTemplate> 
      <ItemStyle HorizontalAlign="Center" Width="240"/> 
      <FooterTemplate> 
       <asp:TextBox ID="NewVariant" runat="server"></asp:TextBox> 
      </FooterTemplate> 
      <FooterStyle Wrap="False"/> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Use"> 
      <ItemTemplate> 
       <asp:CheckBox ID="cbUseVariant" runat="server" 
           Enabled="true"/> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:CheckBox ID="cbUseNewVariant" runat="server"/> 
      </FooterTemplate> 
      <ItemStyle HorizontalAlign="Center"/> 
      <FooterStyle HorizontalAlign="Center"/> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
</ContentTemplate> 
</asp:UpdatePanel> 
<asp:HiddenField runat="server" ID="hfVariantID" ClientIDMode="Static"/> 

코드 숨김 :

/* 
' Copyright (c) 2016 Indy Music Systems 
' All rights reserved. 
' 
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
' DEALINGS IN THE SOFTWARE. 
' 
*/ 

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.IO; 
using System.Linq; 
using System.Web.UI.WebControls; 
using DotNetNuke.Entities.Modules; 
using DotNetNuke.Entities.Modules.Actions; 
using DotNetNuke.Entities.Portals; 
using DotNetNuke.Security; 
using DotNetNuke.Services.Exceptions; 
using DotNetNuke.Services.Localization; 
using IMS.Model; 

namespace IMS.Modules.CreateMerchandise 
{ 
    /// ----------------------------------------------------------------------------- 
    /// <summary> 
    ///  The View class displays the content 
    ///  Typically your view control would be used to display content or functionality in your module. 
    ///  View may be the only control you have in your project depending on the complexity of your module 
    ///  Because the control inherits from CreateMerchandiseModuleBase you have access to any custom properties 
    ///  defined there, as well as properties from DNN such as PortalId, ModuleId, TabId, UserId and many more. 
    /// </summary> 
    /// ----------------------------------------------------------------------------- 
    public partial class View : CreateMerchandiseModuleBase, IActionable 
    { 
     public static readonly String StrPortalId = 
      PortalController.Instance.GetCurrentPortalSettings().PortalId.ToString(); 
     public String curVariantId=""; 
     public GridView gvStore; 
     public ModuleActionCollection ModuleActions 
     { 
      get 
      { 
       var actions = new ModuleActionCollection 
       { 
        { 
         GetNextActionID(), Localization.GetString("EditModule", LocalResourceFile), "", "", "", 
         EditUrl(), false, SecurityAccessLevel.Edit, true, false 
        } 
       }; 
       return actions; 
      } 
     } 


     protected override void OnLoad(EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       gvVariants.DataSource = GetVariantTable(StrPortalId); 
       gvVariants.DataBind(); 
       //Session["gvStore"] = gvVariants; 
       Session["gvStore"] = gvVariants.DataSource; 
      } 
      else 
      { 
       //gvVariants = (GridView)Session["gvStore"]; 
       //gvVariants.DataSource = (DataTable)((GridView)Session["gvStore"]).DataSource; 
       gvVariants.DataSource = (DataTable)Session["gvStore"]; 
       gvVariants.DataBind(); 
      } 
     } 


     protected void gvVariants_OnRowDataBound(Object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      {   
       //curVariantId= gvVariants.DataKeys[e.Row.RowIndex].Value.ToString(); 
       curVariantId = ((DataRowView) e.Row.DataItem)[0].ToString(); 
       GridView gvValues = e.Row.FindControl("gvValues") as GridView; 
       using (var ipv = new IMM_ProductVariantValuesController()) 
       { 
        ipv.Gets(curVariantId,"IMM_ProductVariants_ID",pWhere: $"and (portal_id=-1 or portal_id={PortalId})"); 
        if (!ipv.Recordset.Any()) 
        { 
         ipv.Recordset.Add(new IMM_ProductVariantValues() 
         { 
          ID=-1 
         }); 
        } 
        ipv.LoadDatatable(); 
        gvValues.DataSource = ipv.Datatable; 
        gvValues.DataBind(); 
       } 
      }  
     } 

     protected void gvValues_OnRowDataBound(Object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 

      { 
       if (((DataRowView)e.Row.DataItem)[0].ToString() == "-1") 
       { 
        e.Row.Visible = false; 
       } 
      } 
      if (e.Row.RowType == DataControlRowType.Footer) 
      { 
       Button b = e.Row.FindControl("btnAddValue") as Button; 
       b.OnClientClick = "SetID('" +curVariantId+"')"; 
      } 
     } 

     protected void btnAddValue_Click(object sender, EventArgs e) 
     { 
      GridViewRow row = (GridViewRow)((sender as Button).NamingContainer); 

      string myID = hfVariantID.Value; 
      TextBox txtNewValue = (TextBox)row.FindControl("NewValue"); 
      using (var ipvv = new IMM_ProductVariantValuesController()) 
      { 
       ipvv.Recordset.Add(new IMM_ProductVariantValues() 
       { 
        IMM_ProductVariants_ID = Convert.ToInt32(myID), 
        Portal_ID = Convert.ToInt32(StrPortalId), 
        VariantValue = txtNewValue.Text.Trim().TrimStart(',') //remove leading PostBack comma 
      }); 
       ipvv.Inserts(); 
      } 
     } 

     protected void btnAddVariant_Click(object sender, EventArgs e) 
     { 
      GridViewRow row = (GridViewRow)((sender as Button).NamingContainer); 
      TextBox txtNewValue = (TextBox)row.FindControl("NewVariant"); 
      using (var ipv = new IMM_ProductVariantsController()) 
      { 
       ipv.Recordset.Add(new IMM_ProductVariants() 
       { 
        Portal_ID = Convert.ToInt32(StrPortalId), 
        Name = txtNewValue.Text.Trim().TrimStart(',') //remove leading PostBack comma 
       }); 
       ipv.Inserts(); 
      } 
     } 

     protected void gvVariants_OnRowCommand(Object sender, GridViewCommandEventArgs e) 
     { 
      gvVariants.DataSource = GetVariantTable(StrPortalId); 
      gvVariants.DataBind(); 
      Session["gvStore"] = gvVariants.DataSource; 
     } 

    } 
} 
0

문제가 발생할 몇 가지 문제가 있습니다.

추가 단추에는 onClick 이벤트가 있지만 각 눈금에 onRowCommand도 사용합니다. 추가 단추를 클릭하면 세 가지 이벤트가 발생합니다 (단추 클릭, 상위 모눈 행 명령, 중첩 된 모눈 행 명령).

글로벌 변수 VariantID을 사용하고있는 것 같습니다. 이것은 CommandArgument에서 작동하지만 페이지의 HTML에서 사용해야하는 경우 마지막으로 추가 한 행의 ID 값만 포함합니다. 따라서 작동하지만 권장하지는 않습니다. 이처럼 더 나은 것을 사용하십시오. CommandArgument='<%# Bind("itemID") %>'

속성에있는 VariantID을 추가 버튼에 잘못 사용합니다. CommandArgument="<%=VariantID%>"을 사용하므로 명령 인수는 <%=VariantID%> 문자열입니다. 이런 식으로 사용하십시오 CommandArgument='<%# VariantID %>'

OnLoad(EventArgs e)의 try-catch 블록 외부에 눈금을 바인딩하고 있습니다. 오류가 발생하면 ModuleLoadException을 실행하는 대신 전체 DotNetNuke 페이지를 중단시킵니다. 이것은 테스트 목적 일 수 있지만.

먼저이 문제를 해결하고 도움이되는지 확인하십시오. 그것은 내 개발 서버에서했습니다.

+0

같은 것. 여기에 내가 추가 했어야 할 정보가 더 있습니다. 버튼을 클릭하면 일부 이벤트가 실행됩니다. OnLoad가 실행되고 건너 뜁니다 (! PostBack). 페이지가 다시로드되지만 그리드가 보이지 않는 이유는 바인딩이 어딘가에서 사라지는 것 같기 때문입니다. – Chris

+0

제안한 변경 사항을 포함하여 질문을 편집했습니다. – Chris

관련 문제