2013-10-08 24 views
2

我有以下代码来隐藏列和编辑列标题。但它没有成为习俗。我已经尝试过将各种方法放入DataBound,RowDataBound,RowCreated事件中。但不工作。如何在设置数据源时在gridview中隐藏列

GridView1.AutoGenerateColumns = true; 
GridView1.DataSource = SomeObject[]; 
GridView1.DataBind(); 

foreach (DataControlField col in GridView1.Columns) 
{ 
    if (col.HeaderText == "FirstName") 
    { 
     col.HeaderText = "First Name"; 
    } 
    if (col.HeaderText == "SchoolName") 
    { 
     col.Visible = false; 
    } 
} 

任何人都可以请指教我修复。当你做AutoGenereateColumns = true

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    e.Row.Cells[index].Visible = false; 
} 

,设置使用GridView的RowDataBound事件无形列谢谢

+0

这是否帮助? http://stackoverflow.com/a/3819831/961695 –

+0

不,不想使用硬编码索引。因为我想让它成为未来的证明。如果索引改变将会中断。 – user1211185

+0

如果您采取该解决方案并添加此http://stackoverflow.com/a/9716160/961695? –

回答

1

注意columnss计数将在0。

在ASPX页面,您可以在GridView控件这样

<asp:GridView runat="server" OnRowDataBound="GridView_RowDataBound" .../> 
1

声明代替试试这个:

int indexOfSchoolName = -1; 
int columnIndex = -1; 
foreach(TableCell cell in GridView1.HeaderRow.Cells) 
{ 
    columnIndex ++; 
    if (cell.Text == "FirstName") 
    { 
     cell.Text = "First Name"; 
    } 
    if(cell.Text == "SchoolName") indexOfSchoolName = columnIndex; 
} 
if(indexOfSchoolName != -1) 
{ 
    foreach(GridViewRow row in GridView1.Rows) 
    { 
     row.Cells[indexOfSchoolName].Visible = false; 
    } 
} 
+0

感谢Tim,cell.Text在调试时为空字符串 – user1211185

0

你为什么不从SomeObject []删除该列或克隆,然后取出列?

+0

不想丢失值 – user1211185

+0

此时,@Dusht解决方案似乎是最好的。它使用正确的方法和干净的代码。 –

0

如果SomeObject[]是一个数组,那么您可能需要尝试复制一个SomeObject[]来表示CopyObject[],然后操作该数组以排除所需的列。最后重新绑定到你的网格视图。

0

我常做这样的事情:

private int GetColumnIndexByName(GridView grid, string name) 
{ 
    foreach (DataControlField col in grid.Columns) 
    { 
     if (col.HeaderText.ToLower().Trim() == name.ToLower().Trim()) 
     { 
      return grid.Columns.IndexOf(col); 
     } 
    } 

    return -1; 
} 

GridView1.Columns[GetColumnIndexByName(GridView1, "SchoolName")].Visible = false; 
+0

与我的代码有什么不同? grid.Columns在这里没有任何东西。 – user1211185

+0

正如@Dusht所指出的,您需要将AutoGenereateColumns = true移至数据源就位后。 – Bit