2011-08-29 2 views
0

메신저 내 GridView에 몇 가지 문제가 있습니다. 기본적으로 테이블에 delete 명령을 실행하려고합니다. gridview에는 ItemId, ItemSummary 및 ItemDate라는 3 개의 필드가 바인딩되어 있습니다.GridView DataItem이 모드 변경간에 지속되지 않습니다.

모드 변경 (예 : 선택 및 편집) 중에 이러한 필드는 @ + FieldName 구문을 사용하여 자동 전달됩니다 (예 : ItemId가 @ItemId로 전달됨).

그래서 염두에두고 나는 delete 문을 시도했지만 매개 변수가 전달되지 않았다는 오류가 발생했습니다. 그래서 나는 다른 경로를 시도해 보았다. ItemId를 프로그래밍 방식으로 추출하여 런타임에 매개 변수로 삽입했다.

컨트롤에 바인딩 된 DataItem에서 읽으려고했으나 null이 반환되었습니다.

더 많은 디버깅 후 데이터가 처음 컨트롤에 바인딩되었을 때 DataItem이 올바르게 생성되었지만 모드가 변경되면 바로 DataItem이 null로 나타납니다.

나는 이것을 여러 해 동안 해결하려고 노력 해왔다.

<asp:DetailsView FieldHeaderStyle-CssClass="bold" CssClass="marginLeftRightBottom10px center" 
       AutoGenerateDeleteButton="true" AutoGenerateEditButton="true" GridLines="Both" 
       ID="dvIndividualUpdate" AutoGenerateInsertButton="true" runat="server" AutoGenerateRows="False" 
       DataSourceID="sqldsSingleUpdate" OnDataBound="dvIndividualUpdate_DataBound"> 
       <Fields> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Update Id: 
         </HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label Text='<%# Eval("updateId") %>' ID="lblUpdateId" runat="server"></asp:Label> 
         </ItemTemplate> 
         <InsertItemTemplate> 
          <asp:Label Text='Auto Generated' ID="lblUpdateIdInsert" runat="server"></asp:Label> 
         </InsertItemTemplate> 
         <EditItemTemplate> 
          <asp:Label Text='Auto Generated' ID="lblUpdateIdEdit" runat="server"></asp:Label> 
         </EditItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Update Summary: 
         </HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label Text='<%# Eval("updateSummary") %>' ID="lblUpdateSummary" runat="server"></asp:Label> 
         </ItemTemplate> 
         <InsertItemTemplate> 
          <asp:TextBox CssClass="tbUpdateSummaryInsert" TextMode="MultiLine" Text='<%# Bind("updateSummary") %>' 
           ID="tbUpdateSummary" runat="server"></asp:TextBox> 
         </InsertItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox CssClass="tbUpdateSummaryEdit" TextMode="MultiLine" Text='<%# Bind("updateSummary") %>' 
           ID="tbUpdateSummary" runat="server"></asp:TextBox> 
         </EditItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <HeaderTemplate> 
          Update Date: 
         </HeaderTemplate> 
         <ItemTemplate> 
          <asp:Label Text='<%# Eval("dateOfUpdate") %>' ID="lblDateOfUpdateInsert" runat="server"></asp:Label> 
         </ItemTemplate> 
         <InsertItemTemplate> 
          <asp:Label Text='' ID="lblEditDateOfUpdate" runat="server"></asp:Label> 
         </InsertItemTemplate> 
         <EditItemTemplate> 
          <asp:Label Text='<%# Eval("dateOfUpdate") %>' ID="lblDateOfUpdateEdit" runat="server"></asp:Label> 
         </EditItemTemplate> 
        </asp:TemplateField> 
       </Fields> 
      </asp:DetailsView> 
      <asp:Label ID="lblUpdateErrors" runat="server" Text="" CssClass="block colorRed marginBottom10px center"></asp:Label> 

      <asp:SqlDataSource DataSourceMode="DataSet" ID="sqldsSingleUpdate" runat="server" 
       ConnectionString="<%$ ConnectionStrings:myDbConnection%>" SelectCommandType="StoredProcedure" 
       SelectCommand="dbo.getUpdate" InsertCommand="dbo.createUpdate" InsertCommandType="StoredProcedure" 
       OnInserted="sqldsSingleUpdate_Inserted" DeleteCommand="dbo.deleteUpdate" DeleteCommandType="StoredProcedure" 
       OnDeleted="sqldsSingleUpdate_Deleted" OnDeleting="sqldsSingleUpdate_Deleting"> 
       <DeleteParameters> 
        <asp:Parameter Name="updateID" /> 
       </DeleteParameters> 
       <SelectParameters> 
        <asp:ControlParameter Name="updateId" ControlID="gvUpdates" PropertyName="SelectedDataKey.Value" /> 
       </SelectParameters> 
       <InsertParameters> 
        <asp:ControlParameter DbType="Date" ControlID="dvIndividualUpdate$lblEditDateOfUpdate" 
         Name="dateOfUpdate" PropertyName="Text" /> 
       </InsertParameters> 
      </asp:SqlDataSource> 

그리고 내 관련 코드 숨김 :

protected void dvIndividualUpdate_DataBound(object sender, EventArgs e) 
{ 
    if (dvIndividualUpdate.CurrentMode == DetailsViewMode.Insert) 
    { 
     Label lbl = dvIndividualUpdate.FindControl("lblEditDateOfUpdate") as Label; 
     lbl.Text = DateTime.Today.ToString("dd-MM-yyyy"); 
    } 
} 

protected void sqldsSingleUpdate_Inserted(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
     Exception ex = e.Exception; 
     lblUpdateErrors.Text = "There was a problem creating the update."; 
     ErrorSignal.FromCurrentContext().Raise(ex); 
     e.ExceptionHandled = true; 
     return; 
    } 
    else 
    { 
     lblUpdateErrors.Text = "Update created successfully."; 
     gvUpdates.DataBind(); 
    } 
} 
protected void sqldsSingleUpdate_Deleted(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
     Exception ex = e.Exception; 
     lblUpdateErrors.Text = "There was a problem deleting the update."; 
     ErrorSignal.FromCurrentContext().Raise(ex); 
     e.ExceptionHandled = true; 
     return; 
    } 
    else 
    { 
     lblUpdateErrors.Text = "Update deleted successfully."; 
     gvUpdates.DataBind(); 
    } 
} 

덕분에 당신이의 GridView에 데이터 키로 항목 ID를 추가하는 경우, 데이터 소스 컨트롤이 그것을 잡아해야

답변

0

많은 여기 내 코드입니다 업데이트 및 삭제를 자동으로 수행합니다. 데이터 소스에서 업데이트 및 삭제 매개 변수를 제거하고, ItemID를 데이터 키로 할당하고, 해당 샷을 제공하십시오.

+0

이 작동하지만 지금은 다른 문제가 발생했습니다. Youd는 sqlDataSource가 삭제 후에 캐시를 자동으로 지우지 만, 그렇지 않습니다. 프로그래밍 방식으로 작업을 취소하려고했습니다. TheGateKeeper

+0

@TheGateKeeper : 페이지로드시이를 추가하여 페이지의 캐싱을 해제 할 수 있습니다. Response.Cache.SetCacheability (HttpCacheability.NoCache); –

+0

캐시를 사용하지 않으려 고합니다. 삭제가 발생하면 데이터베이스에서 요청하기를 원합니다. 그럼 페이징 등을 위해 캐시를 다시 사용할 수 있습니다. – TheGateKeeper

관련 문제