1

ASP.NET 動的データを使用して、いくつかのデータ テーブルの Web サイトを生成していますが、これまでのところ問題ありません。

しかし、GridView で値が等しいセルを結合したいという顧客からの要求があります。

私は解決策CodeProjectを持っており、通常の ASP.NET ページでうまく機能します。

ただし、すべての行を動的データで生成された GridView の 1 つの行にマージするだけです。ソース コードをたどったところ、GridView_PreRenderメソッド内のrow.Cells[cellIndex].Textが常に空であることがわかりました。

だから、2つのセルが同じかどうかは判断できません。誰もそのような問題に遭遇したことがありますか?

4

1 に答える 1

0

私の調査に基づいて、 ASP.NET 動的データGridView'sでイベント時にセルの値を取得PreRenderするには、次のことを行う必要があります。

  1. FieldTemplateセルのコントロール コレクションでを見つけます
  2. プロパティにアクセスするためにキャストFieldTemplateするFieldTemplateUserControl

私のプロジェクトに基づいて問題をシミュレートしました。

List.aspx.cs:

protected void gvOffices_PreRender(object sender, EventArgs e)
{
    for (int rowIndex = gvOffices.Rows.Count - 2; rowIndex >= 0; rowIndex--)
    {
        GridViewRow row = gvOffices.Rows[rowIndex];
        GridViewRow previousRow = gvOffices.Rows[rowIndex + 1];

        if (row.RowType == DataControlRowType.DataRow)
        {
            for (int i = 0; i < row.Cells.Count; i++)
            {
                string dataField = ((DynamicField)((DataControlFieldCell)row.Cells[i]).ContainingField).DataField;
                Control dataControl = ((FieldTemplateUserControl)((DynamicControl)row.Cells[i].FindDynamicControlRecursive(dataField)).FieldTemplate).DataControl;
                string cellText = ((Literal)dataControl).Text; // for text fields

                string dataFieldPrev = ((DynamicField)((DataControlFieldCell)previousRow.Cells[i]).ContainingField).DataField;
                Control dataControlPrev = ((FieldTemplateUserControl)((DynamicControl)previousRow.Cells[i].FindDynamicControlRecursive(dataField)).FieldTemplate).DataControl;
                string cellTextPrev = ((Literal)dataControl).Text; // for text fields

                Response.Write(cellText);
                Response.Write(cellTextPrev);

                //if (cellText == cellTextPrev)
                //{
                //    row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan < 2 ? 2 :
                //                           previousRow.Cells[i].RowSpan + 1;
                //    previousRow.Cells[i].Visible = false;
                //}
            }
        }
    }
}

FindDynamicControlRecursive()http://csharpbits.notaclue.net/2009/01/dynamic-data-cascading-fieldtemplates.htmlで見つけることができます。

プロジェクトでこの手法を検討してください。これが役立つことを願っています。

編集1:

また、GridView セル内のコントロールがHyperLinkorであるかどうかを確認する必要がありLiteralます。

if (dataControl is Literal)
{
    cellText = ((Literal)dataControl).Text;
}
else
{
    if (dataControl is HyperLink)
    {
        cellText = ((HyperLink)dataControl).Text;
    }
}

編集2:(私にとってはうまくいきます)

GridView セル内のコントロールが次のようになっているかどうかを確認しますDynamicField

protected void gvOffices_PreRender(object sender, EventArgs e)
{
    for (int rowIndex = gvOffices.Rows.Count - 2; rowIndex >= 0; rowIndex--)
    {
        GridViewRow row = gvOffices.Rows[rowIndex];
        GridViewRow previousRow = gvOffices.Rows[rowIndex + 1];

        if ((row.RowType == DataControlRowType.DataRow) && (previousRow.RowType == DataControlRowType.DataRow))
        {
            for (int i = 0; i < row.Cells.Count; i++)
            {
                // check for the current row
                if (((DataControlFieldCell)row.Cells[i]).ContainingField is DynamicField)
                {
                    string dataField = ((DynamicField)((DataControlFieldCell)row.Cells[i]).ContainingField).DataField;
                    Control dataControl = ((FieldTemplateUserControl)((DynamicControl)row.Cells[i].FindDynamicControlRecursive(dataField)).FieldTemplate).DataControl;

                    string cellText = string.Empty;
                    if (dataControl is Literal)
                    {
                        cellText = ((Literal)dataControl).Text;
                    }
                    else
                    {
                        if (dataControl is HyperLink)
                        {
                            cellText = ((HyperLink)dataControl).Text;
                        }
                    }

                    // get cells text of the current row
                    Response.Write(cellText);
                }

                // check for the previous row
                if (((DataControlFieldCell)previousRow.Cells[i]).ContainingField is DynamicField)
                {
                    string dataFieldPrev = ((DynamicField)((DataControlFieldCell)previousRow.Cells[i]).ContainingField).DataField;
                    Control dataControlPrev = ((FieldTemplateUserControl)((DynamicControl)previousRow.Cells[i].FindDynamicControlRecursive(dataFieldPrev)).FieldTemplate).DataControl;

                    string cellTextPrev = string.Empty;
                    if (dataControlPrev is Literal)
                    {
                        cellTextPrev = ((Literal)dataControlPrev).Text;
                    }
                    else
                    {
                        if (dataControlPrev is HyperLink)
                        {
                            cellTextPrev = ((HyperLink)dataControlPrev).Text;
                        }
                    }

                    // get cells text of the previous row
                    Response.Write(cellTextPrev);
                }

                // Try to merge cells

                //if (cellText == cellTextPrev)
                //{
                //    row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan < 2 ? 2 :
                //                           previousRow.Cells[i].RowSpan + 1;
                //    previousRow.Cells[i].Visible = false;
                //}
            }
        }
    }
}
于 2013-05-19T18:51:05.147 に答える