2008-10-08 5 views
5

J'ai une base de données GridView dans asp.net 2.0 avec un lien de sélection de ligne. Quand une ligne est sélectionnée, je veux ajouter par programme une ligne de tableau sous la ligne sélectionnée, afin d'imbriquer une autre grille et al.Comment insérer par programme une ligne dans un GridView?

Je fais des recherches pour un client et pour un article, et je pense que mon google-fu n'est pas fort ce soir. Aucune suggestion?

EDIT: En fait, j'avais une solution de travail mais Visual Studio était en quelque sorte déconnecté; fermeture et ré-ouverture VS et la reconstruction de tout a résolu le problème ;-)

Ma solution est posté ci-dessous, s'il vous plaît dites-moi comment faire mieux si possible. Merci!

Répondre

8

Je pense que je l'ai compris. Voici une solution qui semble fonctionner. Il pourrait être amélioré en utilisant les commandes de l'utilisateur mais voici l'essentiel:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && 
     (e.Row.RowState & DataControlRowState.Selected) > 0) 
    { 
     Table tbl = (Table)e.Row.Parent; 
     GridViewRow tr = new GridViewRow(e.Row.RowIndex + 1, -1, 
      DataControlRowType.EmptyDataRow, DataControlRowState.Normal); 
     TableCell tc = new TableCell(); 
     tc.ColumnSpan = GridView1.Columns.Count; 
     tc.Controls.Add(
      makeChildGrid(Convert.ToInt32(
       ((DataRowView)e.Row.DataItem)["ROW_ID_FIELD"]))); 
     tr.Cells.Add(tc); 
     tbl.Rows.Add(tr); 
    } 
} 

protected GridView makeChildGrid(int id) 
{ 
    GridView gv = new GridView(); 
    SqlDataSource sqlds = new SqlDataSource(); 
    sqlds.DataSourceMode = SqlDataSourceMode.DataSet; 
    sqlds.ConnectionString = SqlDataSource1.ConnectionString; 
    sqlds.SelectCommand = "SELECT * from MY_TABLE_NAME " + 
     "WHERE KEY_FIELD = " + id.ToString(); 
    DataView dv = (DataView)sqlds.Select(DataSourceSelectArguments.Empty); 
    gv.DataSource = dv; 
    gv.DataBind(); //not sure this is necessary...? 
    return gv; 
} 
1

Merci d'avoir partagé ce code. J'essaie de faire la même chose (en créant une grille de lecture imbriquée), mais en réalité, vous n'avez pas besoin de créer la grille vous-même. Au lieu de cela, vous pouvez juste envelopper le contrôle dans les balises. J'ai vu un exemple ici http://www.codeproject.com/KB/aspnet/EditNestedGridView.aspx?msg=3089755#xx3089755xx

Vous verriez que le développeur a imbriqué le contrôle gv juste en encapsulant le second contrôle gridview dans les balises.

Si vous pouvez faire ce qu'il fait par le code, ce serait plus efficace. Vous n'auriez pas besoin d'afficher tous les champs sélectionnés !! De plus, vous pouvez visuellement ajouter des contrôles à votre gridview enfant. J'ai converti votre code en vb et fonctionne parfaitement.

Remerciements

Questions connexes