2012-10-23 4 views
1

GridView의 항목에 대한 컨텍스트 메뉴에서 작업하고 있지만 주요한 걸림돌이 하나 있습니다. 데이터베이스를 업데이트하기 위해 HTTP 처리기와 상호 작용하는 JQuery를 마우스 오른쪽 단추로 클릭 한 행의 PK 값을 보내는 방법을 알아낼 수 없습니다.GridViewRow 속성을 설정할 때 InvalidCastExceptions가 발생했습니다.

기본적으로 상황에 맞는 메뉴에는 답글, 읽은 상태로 표시 및 삭제라는 3 가지 항목이 있습니다. 각각의 경우 데이터베이스에서 mailid 값을 JQuery에 사용할 수 있도록해야합니다. 그러면 사용자가 선택한 메일에 회신하거나 HTTP 처리기에 데이터베이스의 어떤 항목을 알릴 수 있는지 알려줄 수있는 페이지로 리디렉션 할 수 있습니다 최신 정보.

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      e.Row.Attributes["onClick"] = "getMailDetail(" + DataBinder.Eval(e.Row.DataItem, "mailid") + ")"; 
      e.Row.Attributes["id"] = DataBinder.Eval(e.Row.DataItem, "mailid"); 

      Label lblStatus = (Label)e.Row.FindControl("lblStatus"); 

      if (lblStatus.Text == "unread") 
      { 
       e.Row.Font.Bold = true; 
      } 
     } 
    } 

나는 GridViewRow의 아무 곳이나 클릭하면 상세하게 메일을 표시하는 페이지를 게재 할 수 있도록 온 클릭이 행에 대한 속성을 설정 해요 :

여기 내 코드입니다. 다른 속성을 사용하여 같은 방법으로 mailid 값을 얻을 수 있다고 생각했습니다.

그리고 .ASPX에

...

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
<script type="text/javascript" src="jquery.contextMenu.js"></script> 
<script type="text/javascript"> 
    function getMailDetail(mailId) { 
     $.ajax({ 
      type: "GET", 
      url: '<%= ResolveUrl("~/GetMail.ashx") %>', 
      data: { mid: mailId }, 
      success: function (data) { 
       var pnlList = $('#<%= pnlList.ClientID %>'); 
       var pnlMail = $('#<%= pnlMail.ClientID %>'); 
       var lblFrom = $('#<%= lblFrom.ClientID %>'); 
       var lblDate = $('#<%= lblDate.ClientID %>'); 
       var lblSubject = $('#<%= lblSubject.ClientID %>'); 
       var lblMessage = $('#<%= lblMessage.ClientID %>'); 

       lblFrom.text(data.From); 
       lblDate.text(data.Date); 
       lblSubject.text(data.Subject); 
       lblMessage.text(data.Message); 

       pnlList.css("display", "none"); 
       pnlMail.css("display", "block"); 
      } 
     }); 
    } 

    function markRead(mailId) { 
     $.ajax({ 
      type: "POST", 
      url: '<%= ResolveUrl("~/MailAction.ashx") %>', 
      data: { mid: mailId, act: "markRead" }, 
      success: window.location = "Inbox.aspx" 
     }); 
    } 

    function deleteMail(mailId) { 
     $.ajax({ 
      type: "POST", 
      url: '<%= ResolveUrl("~/MailAction.ashx") %>', 
      data: { mid: mailId, act: "Delete" }, 
      success: window.location = "Inbox.aspx" 
     }); 
    } 
</script> 
<div class="columns"> 
    <div class="leftcol"> 
     <a href="Write.aspx" class="button">Compose Message</a> 

     <ul> 
      <li><a href="SentItems.aspx">Sent Items</a></li> 
      <li class="active"><a href="Inbox.aspx">Inbox</a></li> 
      <li><a href="DeletedItems.aspx">Deleted Items</a></li> 
     </ul> 
    </div> 

    <div class="rightcol"> 
     <asp:Panel runat="server" ID="pnlList"> 
      <div class="rightalign"> 
       <asp:Label runat="server" ID="lblCount"></asp:Label> 
      </div> 

      <asp:GridView runat="server" ID="gvItems" DataKeyNames="mailid" 
       AutoGenerateColumns="false" onrowdatabound="gvItems_RowDataBound" 
       Width="100%"> 
       <Columns> 
        <asp:TemplateField ItemStyle-CssClass="centeralign"> 
         <HeaderTemplate> 
          <asp:CheckBox runat="server" ID="chkSelectAll" /> 
         </HeaderTemplate> 
         <ItemTemplate> 
          <asp:CheckBox runat="server" ID="chkSelect" /> 
         </ItemTemplate> 
        </asp:TemplateField> 

        <asp:TemplateField ItemStyle-CssClass="hidden" HeaderStyle-CssClass="hidden"> 
         <ItemTemplate> 
          <asp:Label runat="server" ID="lblStatus" Text='<%# DataBinder.Eval(Container.DataItem, "status") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:BoundField ItemStyle-CssClass="hidden" HeaderStyle-CssClass="hidden" DataField="mailid" /> 
        <asp:BoundField DataField="firstname" HeaderText="From" SortExpression="firstname" /> 
        <asp:BoundField DataField="datesent" HeaderText="Date" SortExpression="datesent" DataFormatString="{0:yyyy/MM/dd HH:mm}" /> 
        <asp:BoundField DataField="subject" HeaderText="Subject" SortExpression="subject" /> 
       </Columns> 
      </asp:GridView> 
     </asp:Panel> 

     <asp:Panel runat="server" ID="pnlMail" cssclass="hidden"> 
      <p>From: <asp:Label runat="server" ID="lblFrom"></asp:Label><br /> 
       Sent On: <asp:Label runat="server" ID="lblDate"></asp:Label><br /> 
       Subject: <asp:Label runat="server" ID="lblSubject"></asp:Label></p> 
      <p><asp:Label runat="server" ID="lblMessage"></asp:Label></p> 
     </asp:Panel> 
    </div> 
</div> 

<!-- Row Context Menu --> 
<ul id="contextmenu" class="contextMenu"> 
    <li><a href="#reply">Reply</a></li> 
    <li><a href="#mread">Mark As Read</a></li> 
    <li><a href="#delete">Delete</a></li> 
</ul> 

<script type="text/javascript"> 
    $(document.ready(function() { 
     $(".dataRow").contextMenu({ 
      menu: 'contextmenu' }, 
      function(action, el, pos, mid) { 
       contextMenuWork(action, el, pos); 
      } 
     ); 
    }, 
    function contextMenuWork(action, el, pos) { 
     var mid = $(el).attr("id"); 
     switch (action) { 
      case "reply": 
      { 
       window.location = "Reply.aspx?id=" + mid; 
       break; 
      } 
      case "mread": 
      { 
       markRead(mid); 
       break; 
      } 
      case "delete": 
      { 
       deleteMail(mid); 
       break; 
      } 
     } 
    } 
); 
</script> 

불행하게도 내가 새로 바인딩 GridViewRow의 ID 속성 할당에 InvalidCastException이납니다 여기 내 접근 방식에 문제가있는 것 같습니다 :

암시 적으로 'object'유형을 'string'으로 변환 할 수 없습니다. 명시 적 변환에 오류가 없음에도 불구하고, 나는 비주얼 스튜디오가 디자인에 대해 말해 줄 수 있음을, 지금이

e.Row.Attributes["id"] = (string)DataBinder.Eval(e.Row.DataItem, "mailid"); 

그리고와 그 라인을 대체 (당신이 캐스트를 누락?) 그래서

존재 런타임에 런타임에 다음과 같은 InvalidCastException이 발생합니다.

'System.Int32'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

여기 정수가 어디에서 왔는지 알 수 없으므로 진행 방법을 모르겠습니다.

도움이 될 것입니다.

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      var mailid = DataBinder.Eval(e.Row.DataItem, "mailid"); 
      e.Row.Attributes["onClick"] = "getMailDetail(" + DataBinder.Eval(e.Row.DataItem, "mailid") + ")"; 
      e.Row.Attributes["id"] = mailid.ToString(); 

      Label lblStatus = (Label)e.Row.FindControl("lblStatus"); 

      if (lblStatus.Text == "unread") 
      { 
       e.Row.Font.Bold = true; 
      } 
     } 
    } 

새로운 var과 "에 대한있는 DataItem 값을 선언 다음에 RowDataBound 무효을 변경

+0

mailid에 오타가 있거나 의도하지 않은 실수로 위와 같은 상황이 발생할 수 있으므로 의도 한 값이 없습니다. 추가하여 DataBinder.Eval (e.Row.DataItem, "mailid")에서 어떤 값을보고 확인할 수 있습니까? – Munawar

+0

내 테스트 케이스에서 시계는 내가 기대했던 가치를 보여 주므로 다른 경우에는 다르게 동작 할 것이라고 생각할 이유가 없습니다. 이 값은'object {int} 타입 인 것으로 보이는데, 두 번째 오류가 발생한 곳일 수 있습니다. 그러나 .ToString()과 정수 값을 사용할 수 없습니까? – Ortund

답변

0

나는 내가 한 그래서 뭐하는 여기에 값에 캐스팅 작업을 진행하게 할 것 같았다 적이 있었다 mailid "를 입력 한 다음 .ToString()을 사용하여 모든 문제를 해결했습니다.

관련 문제