【问题标题】:Why am I losing a DataItemTemplate control in a column when I remove all other columns in an ASPxGridView?当我删除 ASPxGridView 中的所有其他列时,为什么我会丢失列中的 DataItemTemplate 控件?
【发布时间】:2015-11-25 15:53:08
【问题描述】:

我有一个 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 消失了。添加了所有应该添加的列。

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

【问题讨论】:

  • 在将列添加到网格视图之前将按钮添加到列中?
  • 这个按钮已经被创建了。并且其列在列删除过程中被跳过。如果列没有被删除(也没有被触摸),为什么按钮没有出现?
  • 奇怪的结果,我承认,重新绑定源时可能会出错,如果你不做任何 datasource= 和 databind() 会发生什么?
  • 新数据不会显示。

标签: asp.net gridview devexpress aspxgridview


【解决方案1】:

要回答您最初的问题,可能是由于将 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.

然后给gridView添加一个clientSide CustomButtonClick事件,通过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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多