问题描述
我在 GridView 中有一些静态列,即带有两个 LinkButton 的模板字段。
问题出现在页面的第3次PostBack,按钮就消失了。
页面.aspx
<asp:GridView ID="gvElenco" CssClass="table table-striped table-bordered table-hover" runat="server" HorizontalAlign="Center" AutoGenerateColumns="false" DataKeyNames="ID" OnRowCommand="gvElenco_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Azioni" ItemStyle-HorizontalAlign="Left">
<ItemTemplate>
<asp:LinkButton ID="btn1" CssClass="btn btn-default btn-sm" runat="server" CommandName="View">
<i class="far fa-folder-open"></i>
</asp:LinkButton>
<asp:LinkButton ID="btn2" CssClass="btn btn-white btn-sm" runat="server" CommandName="Titoli">
<i class="far fa-layer-group"></i>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我像这样填充 GridView:
列:
/// <summary>
/// Generates the columns for the GridView from the DataTable provided. Strings in fieldsToHide will make columns with those names disappear. Also formats dates.
/// Columns (that aren't TemplateFields) are cleared
/// </summary>
/// <param name="gv"></param>
/// <param name="table"></param>
/// <param name="fieldsToHide"></param>
public static void GenerateColumnsFromDataTable(this GridView gv,DataTable table,List<DataControlField> additionalColumns,params string[] fieldsToHide)
{
List<DataControlField> toRemove = new List<DataControlField>();
foreach (DataControlField controlField in gv.Columns)
{
if (controlField.GetType() == typeof(TemplateField))
continue;
toRemove.Add(controlField);
}
toRemove.ForEach(c => gv.Columns.Remove(c));
if (additionalColumns != null && additionalColumns.Count > 0)
additionalColumns.ForEach(c => gv.Columns.Add(c));
foreach (DataColumn column in table.Columns)
{
BoundField field = new BoundField
{
datafield = column.ColumnName,HeaderText = column.ColumnName
};
foreach (string fieldToHide in fieldsToHide)
{
if (column.ColumnName.Equals(fieldToHide,StringComparison.OrdinalIgnoreCase))
{
field.Visible = false;
break;
}
}
gv.Columns.Add(field);
}
}
gvElenco.GenerateColumnsFromDataTable(ds.Tables[0],(List<DataControlField>)null,"id");
gvElenco.RowDataBound += (object sender,GridViewRowEventArgs e) =>
{
if (e.Row.RowType == DataControlRowType.DaTarow)
{
foreach (DataControlFieldCell cell in e.Row.Cells)
{
if (cell.Text.Contains("<") && (cell.Text.Contains("</") || cell.Text.Contains("/>")) && cell.Text.Contains(">"))
cell.Text = Server.HtmlDecode(cell.Text);
}
}
};
gvElenco.DataSource = ds.Tables[0];
gvElenco.DataBind();
所以,因为我认为Asp.net在自己重新生成列时做了一些我不明白的事情,所以决定使用ITemplate并动态添加字段。添加了字段,但问题仍然存在,在第 3 次回发时按钮消失。
在调试时,我注意到列的 ItemTemplate 被设置为 null
,位于页面的 OnInit 和 OnLoad 之间。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)