2017-01-19 61 views
0

我已經搜索了這個,答案似乎不起作用。我有下面的函數的C#代碼隱藏:更改DataGrid中顯示字段的順序

public void Show_Data2(string LPI_ID) 
{ 
    OracleConnection conn = GetConnection(); 
    try 
    { 
     { 
      //conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnCST"].ToString(); 

      OracleCommand cmd3 = new OracleCommand(); 
      cmd3.CommandType = CommandType.StoredProcedure; 
      cmd3.CommandText = "SP_LPI_REGISTER_CLAIM_DETAILS"; 
      cmd3.Connection = conn; 

      cmd3.Parameters.Add("vLPI_ID", OracleType.VarChar, 20).Value = LPI_ID; 
      cmd3.Parameters.Add("vClaimDetails", OracleType.Cursor).Direction = ParameterDirection.Output; 

      //connection2.Open(); 

      var SearchAdapter = new OracleDataAdapter(cmd3); 
      var ds = new DataSet(); 
      SearchAdapter.Fill(ds); 

      DataGrid_ClaimDetail.DataSource = ds; 
      DataGrid_ClaimDetail.DataBind(); 

      // The problem happens here: 
      DataGrid_ClaimDetail.Columns["Item"].DisplayIndex = 0; 
      DataGrid_ClaimDetail.Columns["dt"].DisplayIndex = 1; 
      DataGrid_ClaimDetail.Columns["UserName"].DisplayIndex = 2; 

      if (DataGrid_ClaimDetail.Items.Count < 1) 
      { 
       lblEmpty2.Visible = true; 
       lblEmpty2.Text = "There is no data to display"; 
      } 
      else 
      { 
       lblEmpty2.Visible = false; 
      } 

      conn.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message); 
     conn.Close(); 
    } 
} 

我得在asp.net以下的DataGrid:

<div id="divGrid2" style='width:920px; height:230px; overflow:auto;'> 
     <asp:DataGrid ID="DataGrid_ClaimDetail" runat="server" Visible="true" 
AllowPaging="True" AllowSorting="True" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="true" 
OnCancelCommand="DataGrid_ClaimDetail_CancelCommand" 
OnUpdateCommand="DataGrid_ClaimDetail_UpdateCommand" 
OnEditCommand="DataGrid_ClaimDetail_EditCommand"> 
       <AlternatingItemStyle Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <EditItemStyle BackColor="#999999" Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <FooterStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <PagerStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <SelectedItemStyle BackColor="#E2DED6" Font-Bold="False" Font-Italic="False" 
       Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> 
     <Columns> 
       <asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel" 
         EditText="Select" UpdateText="Update"></asp:EditCommandColumn> 
     </Columns> 

     </asp:DataGrid> 
     <asp:Label ID="lblEmpty2" runat="server" Visible="false" Style="font-weight:bold; font-size:large;"></asp:Label> 
</div> 

如果我拿出在C#3條的DisplayIndex線代碼,它工作正常,但我的字段不是我想要的順序。

如果我把這些線回,我得到的每一行代碼的錯誤:

無法從「字符串」到「廉政」

每個字段名稱的轉換加下劃線。

任何人都可以看到我可能做錯了什麼,或者告訴我如何能夠重新排序GridView中的字段?

回答

0

DataGrid.Columnscollection只有this[Int32]索引器,因此無法通過其名稱(cannot convert from 'string' to 'int')訪問其項目。要使用它,你必須知道所需的索引:

DataGrid_ClaimDetail.Columns[3].DisplayIndex = 0; 

那麼你會如何獲得他們的名字列?

人們似乎對DataGridColumn沒有Name屬性,但你可以嘗試使用每列的HeaderText財產,在標準數據綁定方案應等於原來的數據庫列名:

var columns = DataGrid_ClaimDetail 
    .Columns 
    .Cast<DataGridColumn>() 
    .Where(col => // Not sure but some button columns may be headerless 
     !String.IsNullOrEmpty(col.HeaderText)) 
    .ToDictionary(
     keySelector: col => col.HeaderText, 
     comparer: StringComparer.OrdinalIgnoreCase); 

columns["Item"].DisplayIndex = 0; 

或者你也可以嘗試同樣與BoundColumn.DataField

var columns = DataGrid_ClaimDetail 
    .Columns 
    .OfType<BoundColumn>() 
    .ToDictionary((
     keySelector: col => col.DataField, 
     comparer: StringComparer.OrdinalIgnoreCase); 
+0

關於第一部分; **'DataGridColumn'不包含'DisplayIndex'的定義,並且沒有找到接受'DataGridColumn'類型的第一個參數的擴展方法'DisplayIndex'(您是否缺少using指令或程序集引用?)** –

+0

@JohnyBones嗯,我沒有真正檢查代碼,假設這種屬性存在。在這種情況下,您可能需要通過從「Columns」集合中刪除/添加列來手動重新排序列。當我有時間時,我可能會嘗試獲得一個工作原型,可能明天。 –

+0

經過一番Google搜索之後,似乎可能這隻適用於Windows.Forms,而我在Intranet網站上使用它? –

0

一些試驗和錯誤之後,我來到了一個解決方案。

我做的第一件事是從DataSet更改爲DataTable。這使我可以使用SetOrdinal屬性。它還允許我在代碼隱藏中使用Visible屬性。

var SearchAdapter = new OracleDataAdapter(cmd3); 
var ds = new DataTable(); 
SearchAdapter.Fill(ds); 

ds.Columns[0].SetOrdinal(1); 
ds.Columns[1].SetOrdinal(2); 
ds.Columns[2].SetOrdinal(3); 

DataGrid_ClaimDetail.DataSource = ds; 
DataGrid_ClaimDetail.DataBind(); 

DataGrid_ClaimDetail.Columns[4].Visible = false; 

爲了做到這一點,我不得不將ASP側的AutoGenerateColumns更改爲「false」。然後我硬編碼的列名在<Columns>標籤:

​​

通過更改列的Visible屬性,但它仍然讓我來訪問我存儲在用戶ID字段(它獲取的OnClick事件中使用的值在EditCommandColumn中創建的按鈕)。

不是相當盡我所能,但它完成了工作。

相關問題