web-dev-qa-db-ja.com

自動生成された列を持つASP.NET GridViewの列を非表示にする方法は?

GridView1.Columns.Countは、SqlDataSource1.DataBind();でも常にゼロです。

しかし、グリッドは大丈夫です

できます

for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)

ここでリクエストヘッダーの名前を変更しますが、

GridView1.Columns[i].Visible = false;

GridView1.Columns.Countが0であるため、使用できません。

それで、どうすればそれらを隠すことができますか?

33
cnd

e.Row.Cells[0].Visible = false;をグリッドのRowCreatedイベント内に配置してみてください。

protected void bla_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false; // hides the first column
}

これにより、列全体が自動的に非表示になります。

GridviewのDataBoundイベントのgrid.Columns[i]を介して生成された列にアクセスすることはできません。

45
Jan Jongboom

Columnsコレクションは、AutoGenerateColumns = falseの場合にのみ入力され、手動で列を生成します。

このための良い回避策は、DataSourceプロパティを設定してDataBind()を呼び出す前に、Columnsコレクションを動的に設定することです。

表示するDataTableの内容に基づいて手動で列を追加する関数があります。それが完了したら(そしてDataSourceを設定し、DataBind()を呼び出すと、Columnsコレクションを使用できます。Count値は正しいです。また、列の可視性を最初に必要に応じてオンまたはオフにできます。

static void AddColumnsToGridView(GridView gv, DataTable table)
{
    foreach (DataColumn column in table.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = column.ColumnName;
        field.HeaderText = column.ColumnName;
        gv.Columns.Add(field);
    }
}
11
Steve Hibbert

注:このソリューションは、GridView列が事前にわかっている場合にのみ機能します。

デフォルトのAutoGenerateColumns=trueGridViewを使用しているようです。 AutoGenerateColumns=falseを設定し、列を手動で追加することをお勧めします。

<asp:GridView runat="server" ID="MyGridView"
    AutoGenerateColumns="false" DataSourceID="MySqlDataSource">
    <Columns>
        <asp:BoundField DataField="Column1" />
        <asp:BoundField DataField="Column2" />
        <asp:BoundField DataField="Column3" />
    </Columns>
</asp:GridView>

また、表示する各フィールドにBoundFieldのみを含めます。これにより、データの表示方法に関して最も柔軟性が高くなります。

10
Eilon

私は同じ問題を抱えていました-SQLデータソースにバインドされているため、GridViewコントロールのAutogenerateColumnsを「true」にする必要があり、GridViewコントロールに表示してはいけない列を非表示にする必要がありました。

これを実現する方法は、GridViewの「_RowDataBound」イベントに次のようなコードを追加することです(GridViewのIDが「MyGridView」であると仮定しましょう)。

protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[<index_of_cell>].Visible = false;
    }
}

これでうまくいくでしょう;-)

5
Werner Moecke

これを試して、自動生成された列を持つASP.NET GridViewの列を非表示にしてください。RowDataBound/ RowCreatedも機能します。

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then   // apply to datarow and header 

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False // last column
        e.Row.Cells(0).Visible = False  // first column

    End If
End Sub

Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False
        e.Row.Cells(0).Visible = False

    End If
End Sub
3
markmolamhoi

グリッドがデータバインドされた後、GridView1.Columns[i].Visible = false;を実行する必要があります。

2
ddc0660

2列目のrowdataboundメソッド内

GridView gv = (sender as GridView);
gv.HeaderRow.Cells[2].Visible = false;
e.Row.Cells[2].Visible = false;
1
guestdj

@nCdy:index_of_cellは、.Cellsコレクションで非表示にするセルのインデックス番号に対応する整数に置き換える必要があります。

たとえば、GridViewが次の列を表示するとします。

連絡先の名前|連絡先の番号|顧客番号|アドレス行1 | POST CODE

そして、あなたは[〜#〜] customerid [〜#〜]列を表示しないことを望みます。コレクションのインデックスは0から始まるため、[〜#〜] customerid [〜#〜]列のインデックスは..........?そうです、2 !!とても良い。さて... 'index_of_cell'を置き換えるためにそこに何を入れるべきかを推測しますか??

1
Werner Moecke

スティーブヒバートの応答は非常に役立つことがわかりました。 OPが説明していると思われる問題は、GridViewのAutoGeneratedColumnsの問題です。

このインスタンスでは、コードビハインドでデータテーブルをバインドするときに「表示」する列と非表示にする列を設定できます。

たとえば、次のようにグリッドビューがページにあります。

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" >
</asp:GridView>

そして、ページロードイベント中にPopulateGridViewルーチンの背後にあるコードで呼び出されます。

protected void PopulateGridView()
{
    DataTable dt = GetDataSource();
    gv.DataSource = dt;
    foreach (DataColumn col in dt.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = col.ColumnName;
        field.HeaderText = col.ColumnName;
        if (col.ColumnName.EndsWith("ID"))
        {
            field.Visible = false;
        }
        gv.Columns.Add(field);
    }
    gv.DataBind();
}

上記では、GridView AutoGenerateColumnsがFalseに設定され、コードビハインドを使用してバインドされたフィールドが作成されます。 1つは、ここでGetDataSource()というラベルを付けた独自のプロセスを介して、データソースをデータテーブルとして取得することです。次に、データテーブルの列コレクションをループします。列名が所定の基準を満たしている場合、それに応じてバインドフィールドの表示プロパティを設定できます。次に、データをgridviewにバインドします。これはAutoGenerateColumns = "True"に非常に似ていますが、列の基準を取得できます。このアプローチは、非表示と非表示の基準が列名に基づいている場合に最も役立ちます。

0
TennesseePaul

受け入れられた回答に似ていますが、ColumnNamesの使用を許可で、RowDataBound()にバインドします。

Dictionary<string, int> _headerIndiciesForAbcGridView = null;

protected void abcGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (_headerIndiciesForAbcGridView == null) // builds once per http request
    {
        int index = 0;
        _headerIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells
            .Cast<TableCell>()
            .ToDictionary(c => c.Text, c => index++);
    }

    e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false;
}

RowCreated()で動作するかどうかはわかりません。

0
crokusek

GridView行を反復処理し、ターゲット列のセルを非表示にします。この例では、列4〜6をそのまま表示したいので、それらをスキップします。

_foreach (GridViewRow row in yourGridView.Rows)
   {
     for (int i = 0; i < rows.Cells.Count; i++)
     {
        switch (i)
        {
           case 4:
           case 5:
           case 6:
              continue;
        }
        row.Cells[i].Visible = false;
     };
   };
_

次に、列ヘッダーを個別に削除する必要があります(ヘッダーセルを削除すると、削除するたびにGridViewの長さが変わることに注意してください)。

grdReportRole.HeaderRow.Cells.RemoveAt(0);

0
malikglass

他の人が言ったように、RowDataBoundまたはRowCreatedイベントは機能するはずですが、イベント宣言を避けて、DataBind関数呼び出しのすぐ下にコード全体を配置する場合は、次のことができます。

GridView1.DataBind()
If GridView1.Rows.Count > 0 Then
    GridView1.HeaderRow.Cells(0).Visible = False
    For i As Integer = 0 To GridView1.Rows.Count - 1
        GridView1.Rows(i).Cells(0).Visible = False
    Next
End If
0
Matt Roy