2017-01-19 7 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で、以下のデータグリッドを持っている:

<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ラインを取る場合コード、それは正常に動作しますが、私のフィールドは私が望む順序ではありません。

私は後ろにそれらのラインを入れた場合、私はコードの各行にエラーが発生します。

は「INT」に「文字列」から変換することはできません

とフィールド名の各下線が引かれている。

誰かが私が間違っているのを見ることができますか、またはGridViewのフィールドをどのように並べ替えることができるか教えてください。

答えて

0

DataGrid.Columnscollectionにはthis[Int32]インデクサのみが含まれているため、名前で項目にアクセスすることはできません(cannot convert from 'string' to 'int')。それを使用するには、必要なインデックスを知る必要があります。

DataGrid_ClaimDetail.Columns[3].DisplayIndex = 0; 

どのように名前で列を取得しますか?

ありDataGridColumnにはName財産もないようですが、あなたは、標準のデータバインディングシナリオでは、元のDBの列名と同じでなければならないこと、各列の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

第1部に関しては、 ** 'DataGridColumn'に 'DisplayIndex'の定義が含まれておらず、 'DataGridColumn'タイプの最初の引数を受け入れる拡張メソッド 'DisplayIndex'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)** –

+0

@JohnyBonesええ、私は実際にそのようなプロパティが存在すると仮定してコードをチェックしませんでした。そのような場合は、おそらく列を 'Columns'コレクションから削除/追加することによって列を手動で並べ替える必要があります。そして、私は時間があれば、おそらく明日、実用的なプロトタイプを手に入れようとします。 –

+0

グーグルでは、イントラネットのWebサイトでこれを使用しているのに対し、これはWindows.Formsでしか動作しないようです。 –

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を変更しなければなりませんでした。その後、<Columns>タグに列名をハードコーディングされたI:列のVisibleプロパティを変更することにより

​​

、それはまだ私はユーザーIDフィールドに格納値にアクセスすることを許可(のOnClickイベントで使用されますましたEditCommandColumnで作成されたボタン)。

いいえかなり私が望むようにきちんとしていますが、それは仕事を終えました。

関連する問題