2009-03-26 3 views
7

AutoGenerateColumns = trueの場合、Gridviewの列を操作する方法がないようです。AutoGenerateColumns = trueでGridViewの列を操作する方法はありますか?

私は、ユーザーが何を選択するかに応じて様々な異なるLINQクエリの結果を表示する一般的なGridViewを持っています。私は、AutoGenerateColumnsがうまくいくように動作し、BoundField、TemplateFieldの列などを指定する必要はありません。

さらに、必要に応じて他の列もプログラムで追加しています。プログラムで追加された列は、自動生成された列の左側に表示されます。右に移動したいのですが?

GridView.Columns.Countは、自動生成されたものではなく、プログラムされたものだけをカウントするため、必要な列を並べ替えることはできません。私はRowDataBoundイベントをフックし、必要に応じて何かを隠すことができますが、再配置することはできません。

私はAutoGeneratedColumns = trueをあきらめて、各クエリに対してBoundFieldsをレイアウトするだけですか?何か私にできることはありますか?

答えて

3

あなたはこのようにバインドされたデータで物事を操作することができます。

0

少なくとも現在のGridViewでは自動生成された列を制御することはできません。それはなんとかある場合のGridViewから継承する新しいコントロールを作成することによって、

、あなたは列が作成されている方法のもう少しコントロールを持っているかもしれませんが、私はSHUREないよ

(まだ研究の価値があるかもしれません) MSDNのドキュメントから

AutoGenerateColumnsプロパティ をtrueに設定すると、AutoGeneratedField オブジェクトは自動的にデータソースに フィールドごとに作成されます。各 フィールドは、 の列として表示され、 のフィールドがデータソースに表示されます。 このオプションは、 ソース内のすべてのフィールドを表示する便利な方法です。 ただし、 は、自動的に 生成列フィールドが表示される方法や、 の動作を制限しています。

バインドされた列を自動的に生成しました 列にはフィールドが追加されません コレクション。代わりに、自動的に 列フィールドを生成 GridViewコントロールをさせるの

することは、あなたは 手動でfalseにAutoGenerateColumns プロパティを設定し、その後 カスタムColumnsコレクションを作成 で列フィールドを定義することができます。バインドされた列フィールドに加え て、あなたも あなた 独自に基づいてボタンの列フィールド、チェック ボックス列フィールド、コマンドフィールド、 ハイパーリンク列フィールド、画像 フィールド、または列フィールドを表示することができます定義されたテンプレート。 の詳細については、「列」を参照してください。

Private Sub MyGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Me.RowDataBound 
    If Me.AutoGenerateColumns = True Then 
    If e.Row.RowType = DataControlRowType.DataRow Then 
      e.row.cells.add(some code here to add your special column) 
    End If 
    End If 
End Sub 

あなたがあなた自身のヘッダーを作成する必要があると思いますが、それは非常になんとかです:

1

ブレンダンの答えは、私がこの周りに横たわっていたことを思い出させました。

GridViewの ...

<asp:GridView .... OnRowDataBound="myGridView_RowDataBound"> 

の背後にあるコード...

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     ' Display the data in italics. 
     e.Row.Cells(1).Text = "<i>" & e.Row.Cells(1).Text & "</i>" 
    End If 
End Sub 
0

誰かがまだ答える必要がある場合: だけからe.Row.Cells.Countを使用RowDataBound

0

受け入れられた回答に基づいて、ヘッダー名を使用できるように、RowDataBoundイベントの列名から列のインデックスにマップするための辞書を作成できます。また、列のスワップも表示されます。

Dictionary<string, int> _columnIndiciesForAbcGridView = null; 

protected void detailsReportGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (_columnIndiciesForAbcGridView == null) 
    { 
     int index = 0; 
     _columnIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells 
      .Cast<TableCell>() 
      .ToDictionary(c => c.Text, c => index++); 
    } 

    // Add a column, this shifts the _columnIndiciesForAbcGridView though. 

    TableCell cell = new TableCell(); 
    cell.Text = "new Column"; 
    e.Row.Cells.AddAt(2, cell); 

    // Swap 0 and 1 

    int c0 = _columnIndiciesForAbcGridView["ConfigId"]; 
    int c1 = _columnIndiciesForAbcGridView["CreatedUtc"]; 

    string text = e.Row.Cells[c0].Text; 
    e.Row.Cells[c0].Text = e.Row.Cells[c1].Text; 
    e.Row.Cells[c1].Text = text; 
} 
関連する問題