1

我有一种情况,我在页面 GridView1 - GridView4 上有多个 GridView。所有这些 GridView 在单元格中都有文本框,我想仅在被单击的文本框的列和特定的 GridView 上运行计算函数。

示例:用户单击 GridView3 的第 2 列中的 TextBox 并更改数字值,该特定 TextBox 的 OnTextChange 事件应触发以运行计算并汇总页脚标签中 GridView3 Col2 的所有数字。

我搜索了我发现的所有其他建议,假设您只有 1 个网格,并且您知道计算是在 IE 价格列中完成的预设列,但我不知道用户将在我的任何 4 中编辑哪些列信息网格视图。

我放弃并决定只在整个 GridView 上运行计算代码,而不仅仅是编辑的列,但为此我需要获取包含 TextBox 的 Gridview 的 GridView.ID。广泛的 serches 想出了如何获取发件人项目的 ID,而不是包含发件人的 GridView.ID。

如果有人可以帮助解决这两种情况,请这样做,我将非常感激。

根据下面的对话,我编辑了这篇文章以包含 Tim 提供的编辑后的答案,希望其他人可以从这段代码中学习:

//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();
}

当然假设所有文本框都在TemplateFields并且页脚TextBox具有相同的 ID。AutoPostback如果您想立即回发,请记住设置为 true。

于 2012-11-27T15:37:34.973 回答
0

当 TextChanged 运行时,sender 是对该文本框的引用。您可以使用 parent 属性来找出该文本框的父级。如果您将父级链接在一起(例如txt.Parent.Parent,您最终会找到 GridViewRow 和 GridView 对象。由于要计算列,您必须先找到控件所在的单元格,找到单元格的索引,然后冒泡到网格,遍历该网格中的每一行,并获取匹配索引中的值。我希望你没有启用分页,因为这会扭曲数字(因为它们并不全部存在)。不一项简单的任务,但有可能。

从性能的角度来看,使用 JQuery 或其他方式的客户端解决方案可以获得更好的性能。

于 2012-11-27T15:32:33.040 回答