2015-11-25 67 views
1

我有1列的網格。在用戶交互期間,更多的列被構建並動態添加。無論從網格中添加或刪除多少列,都應始終保留「初始打印」按鈕列。這是網格。當我刪除ASPxGridView中的所有其他列時,爲什麼我在列中丟失了DataItemTemplate控件?

   <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

在將colomn添加到您的gridview之前,將該按鈕添加到您的colomn中? –

+0

該按鈕已經創建,但。其列在列刪除過程中被跳過。如果該列未被刪除(也未觸及),爲什麼該按鈕不顯示? –

+0

奇怪的結果,我承認,也許是一個錯誤,當重新綁定源,如果你只是不做任何datasource =和databind()會發生什麼? –

回答

1

要回答您的原始問題,可能是由於將AutoGenerateColumns設置爲True。當你綁定一個數據源時,它可能會自動生成那個點的列。您可以通過刪除添加列的代碼來測試這一點,我敢打賭,您仍然會看到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. 

然後添加一個客戶方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。

+0

好東西。謝謝大家。 –

0

也許如果你做了兩個gridview,一個只包含按鈕列,另一個用於其餘數據,那肯定能解決問題,因爲你不會觸摸第一個gridview並只綁定你的數據到第二個gridview。只是一個解決方法...不是一個簡單的解決方案,因爲您已經編碼了其餘部分。

相關問題