我有一个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消失。添加了应该添加的所有列。
为什么我会丢失打印按钮但保留其列?
答案 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。只是一个解决方法...不是一个简单的解决方案,因为你已经编写了其余的。