2017-01-19 6 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(); 
    } 
} 

Я получил следующее DataGrid в asp.net:

<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> 

Если я вынимаю 3 DisplayIndex строки в C# код, он отлично работает, но мои поля не в том порядке, который я бы хотел.

Если я ставлю эти строки обратно, я получаю сообщение об ошибке на каждой строке кода:

не может конвертировать из «строка» до «межд»

и каждого из имен полей подчеркивается.

Может ли кто-нибудь увидеть, что я могу делать неправильно, или скажите, как я могу переопределить поля в GridView?

ответ

0

collection имеет только this[Int32] индексатор, поэтому вы не можете получить доступ к своим наименованиям по их именам (cannot convert from 'string' to 'int'). Чтобы использовать его, вы должны знать требуемый индекс:

DataGrid_ClaimDetail.Columns[3].DisplayIndex = 0; 

Итак, как бы вы получили столбцы по их именам?

Там, кажется, нет Name собственности на DataGridColumn, но вы можете попробовать использовать HeaderText свойство каждого столбца, что в стандартной привязки данных сценарий должен быть равен исходному DB имя столбца:

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», и не существует метода расширения «DisplayIndex», принимающего первый аргумент типа «DataGridColumn» (вам не хватает директивы 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; 

Для того, чтобы сделать это, я должен был изменить AutoGenerateColumns на стороне ASP к «ложным». Я тогда жестко имена столбцов в <Columns> тег:

<Columns> 
    <asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel" 
     EditText="Select" UpdateText="Update"></asp:EditCommandColumn> 

    <asp:BoundColumn HeaderText="Status" DataField="Item" /> 
    <asp:BoundColumn HeaderText="Date" DataField="dt" /> 
    <asp:BoundColumn HeaderText="Who" DataField="UserName" /> 
    <asp:BoundColumn HeaderText="UserID" DataField="UserID" ItemStyle-Width="0px" /> 

</Columns> 

Изменяя свойства Видимый столбца, он все еще позволил мне получить доступ к значению я хранить в поле UserID (который привыкает в случае OnClick из кнопка, созданная в EditCommandColumn).

Не довольно такой же чистый, как я надеялся, но он выполнил свою работу.