Gridview 列中的 ItemTemplate 在第三次回发时丢失

问题描述

我在 GridView 中有一些静态列,即带有两个 LinkBut​​ton 的模板字段。

按钮工作正常:

buttons working

问题出现在页面的第3次PostBack,按钮就消失了。

enter image description here

页面.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("&lt;") && (cell.Text.Contains("&lt;/") || cell.Text.Contains("/&gt;")) && cell.Text.Contains("&gt;"))
                cell.Text = Server.HtmlDecode(cell.Text);
        }
    }
};
gvElenco.DataSource = ds.Tables[0];
gvElenco.DataBind();

所以,因为我认为Asp.net在自己重新生成列时做了一些我不明白的事情,所以决定使用ITemplate并动态添加字段。添加了字段,但问题仍然存在,在第 3 次回发时按钮消失。

在调试时,我注意到列的 ItemTemplate 被设置为 null,位于页面的 OnInit 和 OnLoad 之间。

enter image description here

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)