繁体   English   中英

在运行时从DataGridView更改列

[英]Change Column from DataGridView in runtime

这可能很容易,但是我在任何地方都找不到答案。 我正在使用DataTable在ASP.NET Web窗体上动态填充以前创建的DataGridView,但是我想更改该DataGridView上显示的列的名称,而我根本无法弄清楚自己在做什么错。 下面是代码:

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";

设置更改DataTable标题的值不起作用,并且在DataBind之后,DataGridView的Columns.Count属性返回零列! 执行代码后,所有内容均正常显示在我的asp页面上,但标题错误。 我做错了什么?
ks

我以为我挖了足够的东西,但显然不够。 我在这里找到的答案:是否可以通过AutoGenerateColumns = true处理GridView中的列?

下面是结果代码:

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";
        }
    }
}

RowDataBound达到了目的。

您可以尝试使用列别名,这当然取决于您特定的sql应用程序/版本。

DataTable dtUsuarios = DBManager.RunSqlGetDataTable( 
@"select 
  b.UserName [Nome Usuário], 
  c.Email [E-mail], 
  c.IsLockedOut [Bloqueado], 
  c.LastLoginDate [Último Login],  
  case  
    when e.RoleName is not null then 1 
    else 0 end [Administrador] 
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 = "[Nome Usuário]" }; 
gdvUsuarios.DataSource = dvUsuarios; 
gdvUsuarios.DataBind(); 

如果要重命名数据表中的列,只需执行(ColumnName而不是Caption):

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

如果要更改要显示给用户的输出,则可能要在标记中进行。 如果是GridView,请在BoundColumn上指定HeaderText

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM