2014-05-22 1 views
0

텍스트 상자에서 제공 한 날짜 범위를 기준으로로드되는 gridview가 있습니다. 그것은 벌금을 작동하지만 데이터베이스에 레코드가 존재하지 않는 데이터 범위를 ENT하면 FORMAT EXCEPTION ERROR가 발생합니다. 그것은 내가 어디에 데이터베이스 열에 확인란을 바인딩 한 라인에 오류가 발생합니다.서식 예외가 발생했습니다

코드 :

<asp:GridView ID="GridViewSmsComplaints" AllowPaging="True" PageSize="4" runat="server" AutoGenerateColumns="False" CssClass="mGrid" BorderColor="#333333" Width="550px" OnPageIndexChanging="GridViewSmsComplaints_PageIndexChanging" > 
    <Columns> 
     <asp:BoundField HeaderText="ID" DataField="ID" /> 
     <asp:BoundField HeaderText="Recieving Date" DataField="RecievingDate" />  
     <%-- <asp:BoundField HeaderText="ToMobileNo" DataField="ToMobileNo" /> --%> 
     <asp:BoundField HeaderText="FromMobileNo" DataField="FromMobileNo" /> 
     <asp:BoundField HeaderText="Message" DataField="Message" >  
      <ItemStyle Wrap="True" /> 
      </asp:BoundField> 
     <asp:TemplateField HeaderText="IsComplaint"> 
      <ItemTemplate> 
       <asp:CheckBox ID="ckboxIsComplaint" runat="server" Checked='<%# Convert.ToBoolean(Eval("IsComplaint").ToString()) %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

SP :

ALTER PROCEDURE [dbo].[SearchSmsComplaintsByDate_SP] 
    @DateFrom Datetime = null, 
    @DateTo DateTime = null 
AS 
BEGIN 
    Begin Try 
     IF(@DateFrom is null AND @DateTo is null) 
     Begin 
      Set @DateFrom = Convert(date,(Select min(ReceivedMessages.ReceivedDateTime) from ReceivedMessages)) 
      Set @DateTo = Convert(date,(Select max(ReceivedMessages.ReceivedDateTime) from ReceivedMessages)) 

      SELECT [ID] 
      ,REPLACE(convert(varchar, ReceivedMessages.ReceivedDateTime, 106), ' ','/') as RecievingDate 
      ,[FromMobileNo] 
      ,[Message] 
      ,[IsComplaint] 
      FROM [CmsSMSDb].[dbo].[ReceivedMessages] 
      where Convert(date,ReceivedDateTime)>= @DateFrom AND Convert(date,ReceivedDateTime)<= @DateTo 
      AND IsComplaint!=1 

     End 
     Else IF(@DateFrom is not null AND @DateTo is not null) 
     Begin 
      SELECT [ID] 
      ,REPLACE(convert(varchar, ReceivedMessages.ReceivedDateTime, 106), ' ','/') as RecievingDate 
      ,[FromMobileNo] 
      ,[Message] 
      ,[IsComplaint] 
      FROM [CmsSMSDb].[dbo].[ReceivedMessages] 
      where Convert(date,ReceivedDateTime)>= @DateFrom AND Convert(date,ReceivedDateTime)<= @DateTo 
      AND IsComplaint!=1 
     End 
    End Try 
    Begin Catch 
     Select ERROR_MESSAGE() as ErrorMsg 
    End Catch 
END 

답변

2

귀하의 문제는 가능성이 라인에서 유래; IsComplaint 필드의 데이터가 비어/null의 경우

<asp:CheckBox ID="ckboxIsComplaint" runat="server" Checked='<%# Convert.ToBoolean(Eval("IsComplaint").ToString()) %>' /> 

, 다음 부울로 변환 형식의 예외와 함께 실패합니다.

데이터 변환을보다 세밀하게 제어 할 수 있도록 행 databound 이벤트를 Gridview에 추가 할 수 있습니다.

<asp:GridView ID="GridViewSmsComplaints" AllowPaging="True" PageSize="4" 
    runat="server" AutoGenerateColumns="False" CssClass="mGrid" 
    BorderColor="#333333" Width="550px" 
    OnPageIndexChanging="GridViewSmsComplaints_PageIndexChanging" 
    OnRowDataBound="GridViewSmsComplaints_RowDataBound" > 

... 그리고이가 지금에 처리되는대로 다음 (체크 박스 구성 요소에서 인라인 데이터 바인딩을 제거 할 수 있습니다

protected void GridViewSmsComplaints_RowDataBound(object sender, GridViewRowEventArgs e) { 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     CheckBox ckboxIsComplaint = e.Row.FindControl("ckboxIsComplaint") as CheckBox; 

     if (ckboxIsComplaint != null) { 
      bool isComplaint; 
      string dataItem = DataBinder.Eval(e.Row.DataItem, "IsComplaint") as string; 

      if (!String.IsNullOrEmpty(dataItem)) { 
       if (Boolean.TryParse(dataItem, out isComplaint)) { 
        ckboxIsComplaint.Checked = isComplaint; 
       } 
      } 
     } 
    } 
} 

당신의 코드 숨김 파일에 다음과 같은 것을 포함 코드 숨김). 그래서 이것은 단순한 체크 박스 컨트롤이됩니다.

<asp:CheckBox ID="ckboxIsComplaint" runat="server" /> 
관련 문제