1

これが、GridViewコントロールにデータを入力する方法です。これは、.aspxフロントエンドからではなく、コードビハインドから行っています。以下は私が持っているものの極端に省略されたバージョンです:

private void UpdateGridView()
{
    DataTable temptable = new DataTable();
    DataColumn idcol = new DataColumn();
    DataColumn titlecol = new DataColumn();
    idcol.ColumnName = "ID";
    titlecol.ColumnName = "Title";
    temptable.Columns.Add(idcol);
    temptable.Columns.Add(titlecol);

...(get data from the database, store it as variable "x")...

    DataRow tempdr;
    tempdr[idcol] = x.ID;
    tempdr[titlecol] = x.Title;

    temptable.Rows.Add(tempdr);

    GridView1.DataSource = temptable;
    GridView1.DataBind();
}

GridViewの「AllowPaging」をtrueに設定してページングを処理するには、次のイベントハンドラーがあります。

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    UpdateGridView();
}

そして、これはうまくいきます!

ただし、RowDataBoundイベントハンドラーもあります。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false; //hide the ID

    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.Attributes["onclick"] = "location.href='newsindex.aspx?NewsArticleID=" + e.Row.Cells[0].Text + "'";
    }
}

ここでの私の目標は、行自体をクリック可能にし、その行のIDと等しいクエリ文字列を持つ別のページに移動することです。行を作成するときにID列にアクセスできるように、ID列の値が必要です。これにより、リンクのQueryStringにIDを追加できます。ただし、ID列を表示したくないので、次の行に追加しましたe.Row.Cells[0].Visible = false; 。これを行うと、ページング機能が機能しなくなります。ページ番号は表示されなくなります。この1行をコメントアウトすると、すべて機能しますが、IDはGridViewに表示されます。

1)なぜですか?2)同じ機能を取得するために何ができますか?ただし、可能な限り変更を最小限に抑えますか?

4

1 に答える 1

0

多くの試行錯誤の末、私はそれを理解しました。これは非常にまれな問題のように思われるので、条件がかなり具体的であるため、インターネット上にはあまりありません。私が読んだ内容のほとんどは、IDを通常の列としてGridViewに配置する代わりに、DataKeyNamesを使用することについて話していました。

私はそれがうまくいくかもしれないと確信していますが、私はこれと格闘するのにかなりの時間をすでに浪費していたので、できるだけ早く解決策が必要でした。

解決策は、GridViewsRowDataBoundイベントにあります。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.Cells[0].Visible = false; //hide the ID
        e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.Attributes["onclick"] = "location.href='newsindex.aspx?NewsArticleID=" + e.Row.Cells[0].Text + "'";
    }
}

どうやら、e.Row.Cells[0].Visible = false;私が最初の質問で持っていたような条件なしで使用すると、それはどういうわけかそれをポケットベルを見えなくするための兆候として解釈します。解決策は、ifブロックに行を含めることでしたe.Row.Cells[0].Visible = false;。これは、DataRowsの最初のセルとヘッダーのみを非表示にする(ページャーなどの他の要素は非表示にしない)ことを示しています。

編集:GridViewの並べ替えを使用している場合、上記は並べ替えを台無しにすることに気づきました。並べ替えを有効にしたまま、ポケットベルを表示し、最初の列を非表示にするには、次のようにします。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.Cells[0].Visible = false; //hide the ID
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
            e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
            e.Row.Attributes["onclick"] = "location.href='newsindex.aspx?NewsArticleID=" + e.Row.Cells[0].Text + "'";
        }
    }
}
于 2012-06-12T00:43:23.970 に答える