当我删除 ASPxGridView 中的所有其他列时,为什么会丢失列中的 DataItemTemplate 控件?

Why am I losing a DataItemTemplate control in a column when I remove all other columns in an ASPxGridView?

我有一个 1 列网格。在用户交互过程中,会动态构建和添加更多列。无论在网格中添加或删除多少列,初始打印按钮列都应始终保留。这是网格。

                <dx:ASPxGridView ID="gvAdvancedResults"
                    ClientInstanceName="gvAdvancedResults" runat="server" EnableRowsCache="False" KeyFieldName="ID" AutoGenerateColumns="True">
                    <Columns>
                        <dx:GridViewDataColumn Width="3%" VisibleIndex="0" Caption="Print">
                            <DataItemTemplate>
                                <dx:ASPxButton ID="btnDisplayMEC" runat="server" OnClick="btnDisplayMEC_OnClick" ClientInstanceName="btnDisplayMEC" CommandArgument='<%# Eval("ID") %>'
                                    CssClass="reportbutt" BackColor="Transparent" Border-BorderStyle="None" Width="16" Height="16">
                                    <Image Url="~/Assets/Images/printer.png" Width="16" Height="16"></Image>
                                </dx:ASPxButton>
                            </DataItemTemplate>
                        </dx:GridViewDataColumn>
                    </Columns>                                               
                </dx:ASPxGridView>

单击按钮后,我使用以下命令从数据表 dt

中清除并重新填充网格列
    'Remove all columns except the first (index 0)
    For gix As Integer = gvAdvancedResults.Columns.Count - 1 To 1 Step -1
        If gix <> 0 Then gvAdvancedResults.Columns.RemoveAt(gix)
    Next

    'Add new columns to the gridview
    For Each col As DataColumn In dt.Columns
        Dim xcol As Object = gvAdvancedResults.Columns(col.ColumnName)
        If xcol IsNot Nothing Then Continue For
        Dim newcol As New GridViewDataColumn(col.ColumnName, col.ColumnName)
        gvAdvancedResults.Columns.Add(newcol)
    Next

    gvAdvancedResults.DataSource = dt
    gvAdvancedResults.DataBind()

问题来了。 "Print" 列在列删除过程中保留(应该如此),但该列的 DataItemTemplate 内的 ASPxButton 消失了。所有应该添加的列都已添加。

为什么我丢失了打印按钮但保留了它的列?

也许如果你制作两个网格视图,一个只包含按钮列,另一个包含其余数据,那肯定会解决问题,因为你不会触及第一个网格视图并且只绑定你的数据到第二个gridview。只是一个变通方法...并不是一个简单的解决方案,因为您已经对其余部分进行了编码。

要回答您原来的问题,可能是因为将 AutoGenerateColumns 设置为 True。当您绑定数据源时,它可能会在此时自动生成列。您可以通过删除添加列的代码来对此进行测试,我敢打赌您仍然会看到数据源中的列。它可能就像将 AutoGenerateColumns 设置为 False 一样简单。

如果那行不通,还有一些替代方法...

这会有些工作量,但您可以尝试在后面的代码中制作按钮列模板,这样您就可以在每次页面加载期间清除并重新创建所有列。

或者更简单的方法是使用像这样的自定义命令列...

这是 C# 代码,但在 VB:

中应该类似
gvAdvancedResults.Columns.Clear();

GridViewCommandColumn commandCol = new GridViewCommandColumn(" ");//Blank for no caption.
commandCol.Name = "command";
commandCol.Width = Unit.Pixel(30);
commandCol.ButtonType = GridViewCommandButtonType.Image;
gvAdvancedResults.Columns.Add(commandCol);
commandCol.VisibleIndex = 0;

GridViewCommandColumnCustomButton btnPrint = new GridViewCommandColumnCustomButton();
btnPrint.ID = "print";
btnPrint.Image.Url = "~/Assets/Images/printer.png";
btnPrint.Image.ToolTip = "Print";
commandCol.CustomButtons.Add(btnPrint );

//Then add the rest of the columns.

然后将客户端 CustomButtonClick 事件添加到 gridView 以通过 CustomCallback 事件处理实际打印:

<dx:ASPxGridView ID="gvAdvancedResults"
 ClientInstanceName="gvAdvancedResults" runat="server" 
 EnableRowsCache="False" 
 KeyFieldName="ID" 
 AutoGenerateColumns="False"
 OnCustomCallback="gvAdvancedResults_CustomCallback"
     OR
 OnCustomButtonClick="gvAdvancedResults_CustomButtonClick" 
 >
    <ClientSideEvents CustomButtonClick="function(s, e) {
        if (e.buttonID == 'print')  
        {   
           //Trigger a callbackPanel that is the parent to the gridView.
           someCallbackPanel.PerformCallback(gvAdvancedResults.GetRowKey(e.visibleIndex)); 
           //Or trigger a callback on the gridView and use GetRowKey on the server side.
           gvAdvancedResults.PerformCallback('print');//Handle it on the server.
           //Or some other way.
        }
    }" />

或者处理服务器端ASPxClientGridView.CustomButtonClick事件。除非你真的需要,否则没有例子。

请注意,我将 AutoGenerateColumns 更改为 false,因为您是手动创建列。