1

ページ GridView1 - GridView4 に複数の GridView がある状況があります。これらすべての GridView には、セルに TextBox があります。クリックされた TextBox の列と、その特定の GridView でのみ計算関数を実行したいと思います。

例: ユーザーが GridView3 の列 2 の TextBox をクリックして数値を変更すると、その特定の TextBox の OnTextChange イベントが発生して計算が実行され、フッター ラベルの GridView3 Col2 のすべての数値が合計されます。

私が検索した他のすべての提案は、グリッドが1つしかなく、IEで価格列で計算が行われるプリセット列を知っていることを前提としていますが、ユーザーが私の4つのいずれかで編集する列情報はわかりませんGridView。

私はあきらめて、編集された列だけでなく、GridView 全体で計算コードを実行することを解決しましたが、これを行うには、TextBox を含む Gridview の GridView.ID を取得する必要があります。送信者 Item の ID を取得する方法については広範な検索が行われましたが、送信者を含む GridView.ID は取得されませんでした。

誰かがどちらかの状況で助けてくれるなら、そうしてください、本当に感謝します.

以下の会話に従って、この投稿を編集して、他の人がこのコードから学ぶことを期待して、ティムによって提供された編集済みの回答を含めました。

//This is working code
protected void textBox_TextChanged(Object sender, EventArgs e)
{
    TextBox txt = (TextBox)sender;
    GridViewRow gvRow = (GridViewRow)txt.NamingContainer;
    GridView Grid = (GridView)gvRow.NamingContainer;

    // if you need the index of the column of the TextBox
    int colIndex = 0;
    for (int i = 0; i < gvRow.Cells.Count; i++)
    {
        if (gvRow.Cells[i] == txt.Parent)
        {
            colIndex = i;
            Msg.Text = "Col: "+colIndex.ToString();
            break;
        }
    }

    int gridNum = 0;
    switch (Grid.ID)
    {
        case "GridView1":
            gridNum = 1;
            break;

        case "GridView2":
            gridNum = 2;
            break;

        case "GridView3":
            gridNum = 3;
            break;

        case "GridView4":
            gridNum = 4;
            break;
    }

    Label ColTotal = (Label)Grid.FooterRow.FindControl("G" + gridNum + "TotalPP" + colIndex);

    double total = 0;
    foreach (GridViewRow row in Grid.Rows)
    {
        TextBox tb = (TextBox)row.FindControl(txt.ID);
        double d;
        if (double.TryParse(tb.Text, out d))
            total += d;
    }
    ColTotal.Text = total.ToString(); 
}

ご覧のとおり、コードの設定方法によると、colIndex は各列のフッター ラベルを見つけて合計を入れるのに役立ちます。

4

2 に答える 2

1

すべてTextBoxesに同じTextChangedイベントを処理させ、この(テストされていない)コードを使用できます。

protected void textBox_TextChanged(Object sender, EventArgs e)
{
    TextBox txt = (TextBox) sender;
    GridViewRow gvRow = (GridViewRow) txt.NamingContainer;
    GridView gv = (GridView) gvRow.NamingContainer;
    // if you need the index of the column of the TextBox
    // as commented below you're using .NET 2.0
    int colIndex;
    for (int i = 0; i < gvRow.Cells.Count; i++)
    {
        if (gvRow.Cells[i] == txt.Parent)
        {
            colIndex = i;
            break;
        }
    }

    double total = 0;
    foreach (GridViewRow row in gv.Rows)
    {
        TextBox tb = (TextBox)row.FindControl(txt.ID);
        double d;
        if (double.TryParse(tb.Text, out d))
            total += d;
    }
    var tbFooter = (TextBox) gv.FooterRow.FindControl(txt.ID);
    tbFooter.Text = total.ToString();
}

もちろん、すべての TextBoxes が含まれてTemplateFieldsおり、フッターTextBoxの ID が同じであると仮定します。AutoPostbackすぐにポストバックする場合は、忘れずに true に設定してください。

于 2012-11-27T15:37:34.973 に答える
0

TextChanged が実行されると、sender はそのテキスト ボックスへの参照になります。親プロパティを使用して、そのテキストボックスの親が何であるかを調べることができます。親を一緒にチェーンすると (のようなものtxt.Parent.Parentで、最終的に GridViewRow オブジェクトと GridView オブジェクトが見つかります。列を計算する必要があるため、最初にコントロールが含まれるセルを見つけ、セルのインデックスを見つけてから、グリッドまでバブルアップし、そのグリッドの各行をループして、一致するインデックスの値を取得します.ページングを有効にしないでください.ページングを有効にすると、数字が歪んでしまいます(すべてが存在するわけではないため).簡単な作業ですが、可能です。

パフォーマンスの観点からは、JQuery などを使用したクライアント側のソリューションを使用すると、パフォーマンスが向上します。

于 2012-11-27T15:32:33.040 に答える