【问题标题】:Getting the ID of a GridView from a button Click contained within that gridview从该gridview中包含的按钮Click获取GridView的ID
【发布时间】:2012-11-27 15:24:07
【问题描述】:

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

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

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

我放弃并决定只在整个 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会帮我找到每一列的页脚标签,并将其放入。

【问题讨论】:

    标签: c# asp.net gridview textbox


    【解决方案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。

    【讨论】:

    • 感谢您的代码和建议,我会试试他的,看看它在哪里。我会告诉你它是否有效。
    • 到目前为止,您的解决方案似乎效果最好,但是有没有办法获取已更改的 textBox 的 columnIndex?比如int ColIndex = ?? //The column index of the edited textbox?这是我需要修复项目的最后一张照片。
    • 为什么需要它?如果您使用TemplateFieldsFindControl 是更好的方法。如果您的页脚控件需要它,您还可以在 ID 可预测时使用 FindControl(例如,与 TextBox 相同的 ID 或相同的后缀(例如 TextBox_4,派生“4”)。
    • @ragscoon:但是,我已经编辑了我的答案以提供一种获取 colindex 的方法。但我一般不喜欢txt.Parent 方法(考虑到控件将嵌套在另一个容器控件中)。
    • 感谢您的回复,我需要它,因为我的 GridViews 有 27 列,并且在模板中我为每列 IE:G1TotalPP1 G1 对应于 Grid 1 的 4 I页面上有,PP1 是列号。我正在为每一列找到页脚标签,以便我可以将这些列总计放在每一列中:Label ColTotal = (Label)Grid.FooterRow.FindControl("G" + gridNum + "TotalPP" + ColIndex); ColTotal.Text = total.ToString(); GridNum 变量是使用开关/大小写分配的,以查看我是否从 G1、G2 等获取 TextBox 触发器..
    【解决方案2】:

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

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

    【讨论】:

    • 我有一个类似的想法,我试图通过使用:protected void calculate_Col(object sender, EventArgs e) { TextBox ClickedBox = (TextBox)sender; GridViewRow row = (GridViewRow)ClickedBox.NamingContainer; int RowIdx = row.RowIndex; Msg.Text = RowIdx.ToString(); } 找到文本框控件的行索引来获得它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多