2010-03-03 8 views
0

J'essaie de définir immédiatement une ligne en mode Édition après sa création. Cependant, mon GridViewRow a une mauvaise DataItemIndex et DataItem nulle ...Pourquoi mon GridViewRow.DataItemIndex est-il incorrect et DataItem nul?

Voici une idée générale de ce que fait mon code: (pseudo code VB)

Protected Sub gvItems_RowCommand(....) 
    if (e.CommandName = 'New') 
    Begin 
    // create new empty and add it to my data table 
    m_dtItems.Rows.Add(m_dtItems.NewRow()) // m_dtItems is a DataTable 

    // rebind the gridview to the modified data table 
    gvItems.DataSource = m_dtItems 
    gvItems.DataBind() 

    // loop through grid view to find the row we just inserted 
    Dim newRowDataItemIndex As Integer = m_dtItems.Rows.IndexOf(dRow) 

    For each row in gvItems.Rows 
     if (row.DataItemIndex = newRowDataItemIndex) 
     gvItems.EditIndex = row.RowIndex 

    // rebind the grid so the edit index takes effect 
    gvItems.DataSource = m_dtItems 
    gvItems.DataBind() 
    End 
End Sub 

Le problème est que GridViewRow.DataItemIndex est pas correct. Il semble être égal à RowIndex. En outre, mon GridViewRow.DataItem est null sauf à l'intérieur de l'événement GridViewRow_RowDataBound.

Je n'utilise pas la pagination ou le tri, ce qui, je le sais, cause des problèmes.

Qu'est-ce que je fais mal?

Répondre

0

Il semble que le problème était qu'une table de données pouvait contenir des lignes supprimées (par exemple, DataRow.RowState = Supprimé) et que la vue de grille ne contenait que des lignes "valides". Par conséquent, les DataItemIndex ne correspondent pas et vous pouvez également obtenir des exceptions si vous essayez de faire référence à une ligne supprimée. La solution consistait à lier la vue de grille à une vue de données (myDataTable.DefaultView) avec un RowStateFilter de CurrentRowsOnly, puis à effectuer toutes les modifications (ajouter, modifier et supprimer) à travers la vue de données.

Questions connexes