2012-09-07 2 views
0

(조건에 따라) gridview에서 행을 삭제하고 "master"gridview의 RowDataBound 이벤트 내부의 다른 gridview에 행을 추가하려고합니다. 원래는 .DeleteRow (i)를 호출하기 위해서는 "ondelete"이벤트 핸들러가 필요하다는 것을 몰랐습니다. 그러나 모든 gridview의 .DeleteRow 메서드가이 이벤트 처리기를 호출하므로 사용 방법에 관해 혼동 스럽습니다. 누군가가 올바른 방향으로 나를 가리 키도록 도와 줄 수 있습니까?gridview의 RowDataBound 이벤트에서 행을 삭제하는 방법

Protected Sub grdProduct_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdProduct.RowDataBound 

    ' Grey out expired products 
    Dim row As GridViewRow 
    row = e.Row 

    Dim incomingDate As String 
    Dim incomingStatus As String = "" 

    incomingDate = row.Cells(3).Text.ToString() 
    incomingStatus = row.Cells(5).Text.ToString() 

    If (e.Row.RowType <> DataControlRowType.DataRow) Then 
     Exit Sub 
    End If 

    Try 
     Dim expDate As Date = incomingDate 
     If (expDate < DateTime.Today Or incomingStatus.Equals("D")) Then 

      'Create object for RowValues 
      Dim RowValues As Object() = {"", "", "", "", "", ""} 

      'Create counter to prevent out of bounds exception 
      Dim i As Integer = row.Cells.Count 

      'Fill row values appropriately 
      For index As Integer = 0 To i - 1 
       RowValues(index) = row.Cells(index).Text 
      Next 

      'create new data row 
      dProdRow = dProdtable.Rows.Add(RowValues) 
      dProdtable.AcceptChanges() 

      grdProduct.DeleteRow(e.Row.RowIndex) 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 

Protected Sub grdProduct_Delete(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grdProduct.RowDeleting 
    'Not sure what to do here 
End Sub 
+1

DeleteRow 메소드 대신 기본 그리드의 데이터 소스에서 행을 삭제하고 원하는 이벤트 (예 : CommandEvent 또는 Button-Click)에서 중첩 된 그리드의 소스에 추가 할 수 있습니다. 나중에'MainGrid.DataBind()'를 호출하면됩니다. –

+0

RowDataBound 이벤트와 별도로 public 서브에서 선언 된 데이터 소스를 가지고 있습니다. 이 작업을 수행하기 위해 데이터 소스의 범위를 변경해야합니까? 불행히도 RowDataBound 이벤트를 사용하여 조건을 테스트해야합니다. – NealR

답변

0

이 작업을 수행하는 가장 좋은 방법은 UI 구성 요소 자체를 조작하는 대신 데이터 소스 레벨에서이를 조작하는 것입니다. 예를 들어

:

if(!IsPostback) 
{ 
    DataTable one = ... 
    DataTable two = ... 

    var removeRows = (from c in one.AsEnumerable() 
        where c.Field<DateTime>("incomingDate")< incomingDate || 
          c.Field<string>("incomingStatus")=="D" 
        select c).ToList(); 

    for(var item in removeRows) 
    { 
     two.ImportRow(item); 
    } 
    //now delete from initial table 
    foreach(var item in removeRows) 
    { 
     one.Rows.Remove(item); 
    } 

    //Now bind both grids 
    grid1.DataSource=one; 
    grid1.DataBind(); 
    grid2.DataSource=two; 
    grid2.DataBind(); 

} 

업데이트 - VB.NET에서 샘플 장난감이 프로그램은 희망 당신은 당신의 상황에 적용 할 수 있습니다.

Sub Main 
    Dim one As New DataTable() 
    one.Columns.Add("one", GetType(Integer)) 
    For i As Integer = 0 To 9 
     Dim r As DataRow = one.NewRow() 
     r.ItemArray = New Object() {i} 
     one.Rows.Add(r) 
    Next 

    Dim two As New DataTable() 
    two.Columns.Add("one", GetType(Integer)) 
    For i As Integer = 0 To 9 
     Dim r As DataRow = two.NewRow() 
     r.ItemArray = New Object() {i} 
     two.Rows.Add(r) 
    Next 
    Dim removeRows = (From c In one.AsEnumerable() Where c.Field(Of Integer)("one") = 5).ToList() 

    For Each item As DataRow In removeRows 
     two.ImportRow(item) 
    Next 

    For Each item As DataRow In removeRows 
     one.Rows.Remove(item) 
    Next 

End Sub 

저는 방금 VB.NET을 사용하고 있다는 것을 깨달았습니다. 위의 내용을 C#에서 VB.NET으로 변환 할 수 있어야합니다. 어쨌든 일반적인 생각이 있습니다.

+0

ImportRow 메서드는 원래 DataTable에서 행을 제거합니까? 여기에서 볼 수있는 것 : http://msdn.microsoft.com/en-us/library/system.data.datatable.importrow(v=vs.80).aspx 그냥 복사본을 만듭니다. – NealR

+0

@NealR 그렇지 않습니다. 너 스스로 그렇게해야 해. 나는 전체 작업 코드로 나의 대답을 업데이트했다. – Icarus

+0

나는 From ... 코드를 VB로 변환하는 데 불가능한 시간을 보내고 있습니다. 가능한지 아십니까? C.Field 및 각각 오류가 발생합니다. c.Field는 "접근 가능한 '필드'가이 인수를 허용하지 않기 때문에 과부하 해결에 실패했습니다." 은 " 'DateTime'은 형식이므로 표현식으로 사용할 수 없습니다." – NealR

관련 문제