当我删除 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,因为您是手动创建列。
我有一个 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,因为您是手动创建列。