2015-05-08 1 views
0

У меня есть скрытый элемент управления во вложенном gridview, чтобы определить, расширена или нет. Я устанавливаю значение в функции javascript. Он устанавливается правильно из-за предупреждений, которые я установил. В методе RowDataBound я хочу прочитать Скрытый элемент управления, чтобы определить, следует ли мне расширять сетку или нет. Когда я читаю значение в методе RowDataBound, он всегда равен «0». Моя разметка огромен, так что это только вложенная сетка, UpdatePanel и hiddencontrol ассоциации:Неверное значение скрытого контроля при чтении в коде за

<asp:UpdatePanel ID="updatePnlNestedGrid" runat="server" UpdateMode="Conditional"> 
<ContentTemplate> 
<div id="div<%# Eval("GroupID") %>" style="display:none">      
<asp:GridView ID="GroupMemberGridView" runat="server" AutoGenerateColumns="false" OnRowDeleting="GroupMemberGridView_RowDeleting" 
OnRowCommand="GroupMemberGridView_RowCommand" CssClass="grid" ShowFooter="true" AllowPaging="true" PageSize="5" 
    onpageindexchanging="GroupMemberGridView_PageIndexChanging" onpageindexchanged="GroupMemberGridView_PageIndexChanged"> 
<Columns> 
    <asp:TemplateField HeaderText="MemberID"> 
     <ItemTemplate> 
      <asp:Label ID="mggvLblMemberID" runat="server" Text='<%# Bind("MemberID") %>'></asp:Label> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Member Name" ItemStyle-Wrap="false"> 
     <ItemTemplate> 
      <asp:Label ID="mggvLblMemberName" runat="server" Text='<%# Bind("MemberName") %>'></asp:Label> 
     </ItemTemplate>    
     <FooterTemplate> 
      <asp:DropDownList ID="mggvDDLMemberName" runat="server" 
       class="chosen-single" data-placeholder="Choose member…"> 
      </asp:DropDownList> 
      <asp:RequiredFieldValidator ID="ReqValueDDLMemberInsert" runat="server" InitialValue="0" 
        ControlToValidate="mggvDDLMemberName" 
        ErrorMessage="Selection required." CssClass="message-error-dropdown"> 
      </asp:RequiredFieldValidator> 
     </FooterTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Active Device(s)">     
     <ItemTemplate> 
      <asp:Label ID="mggvLblActiveDevice" runat="server" Text='<%# (Boolean.Parse(Eval("ActiveDevice").ToString())) ? "Yes" : "No" %>'></asp:Label> 
     </ItemTemplate>     
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Action" ItemStyle-Wrap="false" ItemStyle-HorizontalAlign="Center"> 
     <ItemTemplate> 
      <asp:Button ID="mggvDeleteButton" runat="server" CausesValidation="False" CommandName="Delete" 
       Text="Delete" CssClass="gridActionbutton" OnClientClick="return confirm('Are you sure you want to delete this Group Member?')" > 
      </asp:Button> 
     </ItemTemplate>          
     <FooterTemplate> 
      <asp:Button ID="mggvAddButton" runat="server" CommandName="Add" Text="Add Member" Width="90%" 
       CssClass="gridActionbutton"/> 
     </FooterTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 
</div> 
</ContentTemplate> 
</asp:UpdatePanel>  
<asp:HiddenField ID="mggvIsExpanded" runat="server" ClientIDMode="Static" Value="0" />  

Это Java-функция, расширяющая/сворачивает сетки и устанавливает скрытое значение:

function DivExpandCollapse(groupID) {  
    var div = document.getElementById(groupID); 
    var img = document.getElementById('img' + groupID); 
    //alert shows correct hidden value 
    alert($(div).parent().siblings("input:hidden[id$='mggvIsExpanded']").val()); 
    if (div.style.display == "none") {    
     div.style.display = "inline"; 
     img.src = "Images/minus.png"; 
     $(div).parent().siblings("input:hidden[id$='mggvIsExpanded']").val("1"); 
     $("#" + div.getAttribute('id') + ".chosen-single").chosen("destroy"); 
     $("#" + div.getAttribute('id') + ".chosen-single").chosen({ 
      search_contains: true, 
      width: "100%", 
      placeholder_text_single: "Choose member…", 
      no_results_text: "Sorry, no match!" 
     });   
    } 
    else { 
     div.style.display = "none"; 
     img.src = "Images/plus.png"; 
     $(div).parent().siblings("input:hidden[id$='mggvIsExpanded']").val("0"); 
    } 
} 

Этот это событие, связанное с кодом. Я показываю только скрытый код значения .:

protected void UserGroupGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     int tiGroupID = Convert.ToInt32(UserGroupGridView.DataKeys[e.Row.RowIndex].Value.ToString()); 
     GridView tgvGroupMember = (GridView)e.Row.FindControl("GroupMemberGridView"); 
     HiddenField hiddenExpand = (HiddenField)tgvGroupMember.Parent.FindControl("mggvIsExpanded"); 
     //This value is always "0" - the initial value 
     String hiddenValue = hiddenExpand.Value.ToString(); 
    } 
} 

Даже если скрытое значение задано в javascript. Значение всегда равно нулю в коде, за которым стоит начальное значение.

Почему скрытое значение никогда не отображается как «1» в событии RowDataBound при расширении сетки?

UPDATE я поставил жерех: скрытый внутри ContentTemplate, который находится внутри UpdatePanel. Но он все еще не читает скрытое значение правильно.

+0

Ваш 'HiddenField' не находится внутри' gridview' – renakre

+0

Скрытое поле должно быть внутри gridview? Все примеры имеют это как родной брат UpdatePanel. –

+0

, почему вам нужно 'FindControl()', почему не просто 'mggvIsExpanded.Value', это серверный ... – renakre

ответ

0

Скрытое значение было установлено время, но когда я заселен родительской сетка, скрытое значение сброшено на 0.

Я получил его на работу вызываемого в яваскрипте функцией «» Expand в случае «RowCreated». Это происходит после событий Add Command и RowDataBound.

Работы отлично сейчас.

Спасибо за помощь.

1

Вы обрабатываете скрытое поле, как если бы оно было в недавно привязанной строке GridView.

Просто держать вещи простыми и вместо ссылок FindControl(), ссылки на контроль непосредственно как на mggvIsExpanded как:

protected void UserGroupGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //reference mggvIsExpanded without jumping through hoops 
     String hiddenValue = mggvIsExpanded.Value.ToString(); 
    } 
} 

Если значение по-прежнему не является правильным, это может означать, что вы пытаетесь слишком часто ссылайтесь на элемент управления на раннем этапе жизненного цикла страницы. Убедитесь, что код запускается после Page.Load или иначе вручную получает значение из Request.Form ["mggvIsExpanded"].

+0

Прошу прощения. Я не понимаю. Я должен положить его в колонку в asp.Grid, не так ли? Как выглядит надпись? –

+0

№. Скрытое поле может быть размещено в любом месте (и находится за пределами сетки в вашей разметке). Вы все еще можете ссылаться на него в RowDataBound, даже если он находится вне сетки. – Colin

+0

Итак, я могу сохранить HiddenField после UpdatePanel? –

Смежные вопросы