【问题标题】:Change Column from DataGridView in runtime在运行时从 DataGridView 更改列
【发布时间】:2010-08-23 18:19:56
【问题描述】:

这可能很容易,但我无法在任何地方找到答案。我正在使用 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页面上一切正常,但标题错误。我做错了什么?
提示

【问题讨论】:

    标签: c# asp.net datagridview


    【解决方案1】:

    我以为我已经挖得够多了,但显然还不够。我在这里找到的答案: Any way to manipulate the columns in GridView with AutoGenerateColumns = true?

    下面是生成的代码:

    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 成功了。

    【讨论】:

      【解决方案2】:

      您可以尝试列别名,当然这取决于您的特定 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(); 
      

      【讨论】:

      • 我知道,tks。在这个特定的查询中,我可以控制列名,但在过程的情况下,我没有。我不知道如何通过代码动态地做到这一点。
      【解决方案3】:

      如果您想重命名 DataTable 中的列,只需执行(ColumnName 而不是 Caption):

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

      如果您想更改向用户显示的输出,您可能希望在标记中执行此操作。如果是 GridView,请在 BoundColumn 上指定 HeaderText

      【讨论】:

      • 如果我更改列名,我会收到错误,因为列名确实是用户名,我只想更改标题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多