2010-08-23 5 views
1

C'est probablement facile, mais je n'ai pas trouvé de réponse nulle part. Je remplis dynamiquement DataGridView précédemment créé sur un formulaire Web ASP.NET avec un DataTable, mais je souhaite modifier le nom des colonnes qui apparaissent sur ce DataGridView, et je ne peux tout simplement pas comprendre ce que je fais mal . Voici le code:Modifier la colonne à partir de DataGridView dans l'exécution

DataTable dtUsuarios = DBManager.RunSqlGetDataTable(
    @"select b.UserName, c.Email, c.IsLockedOut, c.LastLoginDate, 
     case 
     when e.RoleName is not null then 1 
     else 0 end Admin 
    from dbo.aspnet_Applications a join dbo.aspnet_Users b 
     on a.ApplicationId = b.ApplicationId 
    join dbo.aspnet_Membership c 
     on b.ApplicationId = c.ApplicationId 
     and b.UserId = c.UserId 
    left join dbo.aspnet_UsersInRoles d 
     on d.UserId = b.UserId 
    left join dbo.aspnet_Roles e 
     on d.RoleId = e.RoleId 
    where a.ApplicationName = 'Mont Blanc Catalogo'"); 
dtUsuarios.Columns["UserName"].Caption = "Nome Usuário"; 
dtUsuarios.Columns["Email"].Caption = "E-mail"; 
dtUsuarios.Columns["IsLockedOut"].Caption = "Bloqueado"; 
dtUsuarios.Columns["LastLoginDate"].Caption = "Último Login"; 
dtUsuarios.Columns["Admin"].Caption = "Administrador"; 
DataView dvUsuarios = new DataView(dtUsuarios) { Sort = "UserName" }; 
gdvUsuarios.DataSource = dvUsuarios; 
gdvUsuarios.DataBind(); 
//gdvUsuarios.Columns[0].HeaderText = "Nome Usuário"; 
//gdvUsuarios.Columns[1].HeaderText = "E-mail"; 
//gdvUsuarios.Columns[2].HeaderText = "Bloqueado"; 
//gdvUsuarios.Columns[3].HeaderText = "Último Login"; 
//gdvUsuarios.Columns[4].HeaderText = "Administrador"; 

Réglage des valeurs changeant la légende du DataTable ne fonctionne pas, et après la DataBind, la propriété Columns.Count pour les colonnes retour DataGridView zéro! Après l'exécution du code, tout apparaît normalement sur ma page ASP, mais les légendes sont fausses. Qu'est ce que je fais mal?
Tks

Répondre

1

Je pensais que j'avais assez creusé, mais pas assez, apparemment. La réponse que je trouve ici: Any way to manipulate the columns in GridView with AutoGenerateColumns = true?

Ci-dessous le code résultant:

public partial class admin_CadUsuarios : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable dtUsuarios = DBManager.RunSqlGetDataTable(
      @"select b.UserName, c.Email, c.IsLockedOut, c.LastLoginDate, 
       case 
       when e.RoleName is not null then 1 
       else 0 end Admin 
      from dbo.aspnet_Applications a join dbo.aspnet_Users b 
       on a.ApplicationId = b.ApplicationId 
      join dbo.aspnet_Membership c 
       on b.ApplicationId = c.ApplicationId 
       and b.UserId = c.UserId 
      left join dbo.aspnet_UsersInRoles d 
       on d.UserId = b.UserId 
      left join dbo.aspnet_Roles e 
       on d.RoleId = e.RoleId 
      where a.ApplicationName = 'Mont Blanc Catalogo'"); 
     DataView dvUsuarios = new DataView(dtUsuarios) { Sort = "UserName" }; 
     gdvUsuarios.DataSource = dvUsuarios; 
     gdvUsuarios.DataBind(); 
    } 

    protected void gdvUsuarios_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.Header) 
     { 
      e.Row.Cells[0].Text = "Nome Usuário"; 
      e.Row.Cells[1].Text = "E-mail"; 
      e.Row.Cells[2].Text = "Bloqueado"; 
      e.Row.Cells[3].Text = "Último Login"; 
      e.Row.Cells[4].Text = "Administrador"; 
     } 
    } 
} 

Le RowDataBound a fait l'affaire.

0

Vous pouvez essayer l'alias de colonnes, en fonction bien sûr de votre application/version sql particulière.

+0

Je sais, tks. Dans cette requête particulière, j'ai le contrôle sur les noms de colonnes, mais dans le cas d'une procédure, je ne le fais pas. Je ne voulais pas savoir comment le faire dynamiquement à travers le code. – Pascal

0

Si vous souhaitez renommer les colonnes de votre DataTable, il suffit de faire (NomColonne au lieu de Légende):

dtUsuarios.Columns["UserName"].ColumnName= "Nome Usuário" 

Si vous voulez changer le ouput que vous affichez à l'utilisateur, vous voulez probablement faire cela dans le balisage. Si c'est un GridView, spécifiez un HeaderText sur le BoundColumn

+0

Si je change le nom de la colonne, j'obtiens une erreur, car le nom de la colonne est en effet UserName, et je veux juste changer la légende – Pascal

Questions connexes