从网格视图中包含的Click按钮获取网格视图的ID



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

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

我搜索了一下,我找到的所有其他建议都假设你只有1个网格,并且你知道在IE价格列中计算的是什么预设列,但我不知道用户会在我的4个网格视图中编辑什么列信息。

我放弃了,决定只在整个GridView上运行计算代码,而不仅仅是编辑列,但要做到这一点,我需要获取包含TextBox的GridView的GridView.ID。大量的serches提出了如何获取发件人项的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将帮助我找到每列的页脚标签,并将其总计。

您可以让所有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();
}

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

TextChanged运行时,sender是对该文本框的引用。您可以使用parent属性来查找该文本框的父对象。如果你把父母联系在一起(类似于txt.Parent.Parent,你最终会找到GridViewRow和GridView对象。由于你想计算列,你必须首先找到控件所在的单元格,找到单元格的索引,然后冒泡到网格,循环遍历该网格中的每一行,并获取匹配索引中的值。我希望你没有启用分页,因为这会使数字倾斜(因为他们并不都在场)。这不是一项容易的任务,但有可能。

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

最新更新