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

时间:2015-11-25 15:53:08

标签: asp.net gridview devexpress 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()

现在问题就在于此。 “打印”列保留在列删除过程中(应该如此),但列的DataItemTemplate中的ASPxButton消失。添加了应该添加的所有列。

为什么我会丢失打印按钮但保留其列?

2 个答案:

答案 0 :(得分:1)

要回答原始问题,可能是因为将AutoGenerateColumns设置为True。绑定dataSource时,它可能会在该点自动生成列。您可以通过删除添加列的代码来测试这一点,我打赌您仍会看到dataSource中的列。它可能就像将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.

然后将clientSide 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。

答案 1 :(得分:0)

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