我有一个简单的ASP.NET表,如下所示:
<asp:Table id="tbl">
<asp:TableHeaderRow id="header">
<asp:TableHeaderCell id="hcell1" />
</asp:TableHeaderRow>
<asp:TableRow id="row">
<asp:TableCell id="cell1" />
</asp:TableRow>
</asp:Table>
ID已经组成,实际的表格还有几列。我希望能够以编程方式隐藏任何列(不是javascript)。这可能吗?此时我可以轻松地将标记更改为我想要的任何内容,因此我愿意接受建议。
编辑:很抱歉要清楚。我希望能够简单地隐藏一个列,如果我添加一个新行,我不想更改任何处理隐藏的代码。理想的是:tbl.Columns["ColName"].Visible = false;
不太理想的是for / foreach循环做了类似的事情。
答案 0 :(得分:4)
尝试使用此扩展方法,它扩展了Table类,添加了按索引和TableHeaderCell的ID(如果存在)隐藏列的方法:
但请注意,它不提供任何逻辑来满足跨越其他的列 列:
<强>实施例强>
tbl.HideColumn("HeaderID");
tbl.HideColumn(0);
<强>类强>
public static class TableExtensions
{
public static void HideColumn(this Table table, int index)
{
foreach (TableRow row in table.Rows)
{
if (row.Cells.Count-1 >= index)
{
row.Cells[index].Visible = false;
}
}
}
public static void HideColumn(this Table table, string id)
{
int index = 0;
bool columnFound = false;
if (table.Rows.Count > 1)
{
TableHeaderRow headerRow = table.Rows[0] as TableHeaderRow;
if (headerRow != null)
{
foreach (TableHeaderCell cell in headerRow.Cells)
{
if (cell.ID.ToLower() == id.ToLower())
{
columnFound = true;
break;
}
index++;
}
}
}
if(columnFound)
HideColumn(table, index);
}
}
答案 1 :(得分:2)
在所有标签上放置runat =“server”,然后在代码后面你可以做[control id] .Visible = false;
答案 2 :(得分:1)
标记:
<asp:Table id="tbl" runat="server"> <---!
<asp:TableHeaderRow id="header">
<asp:TableHeaderCell id="hcell1" />
</asp:TableHeaderRow>
<asp:TableRow id="row">
<asp:TableCell id="cell1" />
</asp:TableRow>
</asp:Table>
代码隐藏:
foreach(TableRow row in tb1.Rows)
{
if (row.Columns.Count >= x + 1)
row.Columns[x].Visible = false;
}
答案 3 :(得分:1)
如果您打算使用内置的删除/编辑/选择命令,并且想要隐藏id列,那么风格上隐藏它会更好。
这是我使用的功能
static public void HideColumn(GridView gv, int columnIndex)
{
if (gv.HeaderRow != null)
gv.HeaderRow.Cells[columnIndex].Style.Add("display", "none");
foreach (GridViewRow row in gv.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
row.Cells[columnIndex].Style.Add("display", "none");
}
}
修改强> 和这个家伙一起
static public int GetColumnIndex(GridView gv, string columnName)
{
int returnMe = -1;
for (int i = 0; i < gv.Columns.Count; i++)
{
if (gv.Columns[i].HeaderText == columnName)
{
returnMe = i;
break;
}
}
return returnMe;
}
答案 4 :(得分:0)
除了@jdavies的响应之外,如果我们为任何列指定了列跨度,下面的代码也可以使用。此外,该代码已得到增强,可以根据需要显示或隐藏列。
public static class TableExtensions
{
public static void ShowOrHideColumn(this Table table, int index, bool bShowColumn)
{
foreach (TableRow row in table.Rows)
{
var colIndex = 0;
var actionCol = 0;
foreach (TableCell cell in row.Cells)
{
if (colIndex == index)
{
row.Cells[actionCol].Visible = bShowColumn;
break;
}
colIndex += cell.ColumnSpan == 0 ? 1 : cell.ColumnSpan;
actionCol++;
}
}
}
public static void ShowOrHideColumn(this Table table, string id, bool bShowColumn)
{
int index = 0;
bool columnFound = false;
if (table.Rows.Count > 1)
{
TableHeaderRow headerRow = table.Rows[0] as TableHeaderRow;
if (headerRow != null)
{
foreach (TableHeaderCell cell in headerRow.Cells)
{
if (cell.ID != null && cell.ID.ToLower() == id.ToLower())
{
cell.Visible = bShowColumn;
columnFound = true;
break;
}
index += cell.ColumnSpan == 0 ? 1 : cell.ColumnSpan;
}
}
}
if (columnFound)
table.ShowOrHideColumn(index, bShowColumn);
}
}
此代码也适用于在表的不同行中指定的可变列跨度。