动态获取GridView各单元格中的值

xieganlin 2011-09-26 03:44:24
我现在想通过循环GridView.Rows的循环来获取GridView中各个单元格的值.在网上找说用以下方法:
private OrderedDictionary ExtractRowValues(DataControlFieldCollection Columns, GridViewRow Row)
{
OrderedDictionary oFieldValues;
OrderedDictionary oDictionary;
DataControlField oColumn;

oFieldValues = new OrderedDictionary(Columns.Count);
oDictionary = new OrderedDictionary();

for (int i = 0; i < Columns.Count; i++)
{
oColumn = Columns[i];
if (oColumn.Visible)
{
oDictionary.Clear();
oColumn.ExtractValuesFromCell(oDictionary, (DataControlFieldCell)Row.Cells[i], Row.RowState, false);
foreach (DictionaryEntry oEntry in oDictionary)
{
oFieldValues.Add(oEntry.Key, oEntry.Value);
}
}
}

return oFieldValues;
}
如下调用来获取值:
GridViewRow oRow
System.Collections.Specialized.OrderedDictionary oFieldValues;
oRow = (GridViewRow)oGV.Rows[i];
oFieldValues = ExtractRowValues(oGV.Columns, oRow);
但返回的oFieldValues一直都是空.没有数据.而我的GridView中是有数据的.


请问谁知道怎么循环获取GridView各个单元格中值的告诉一下.急用.谢谢!!
...全文
515 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
OKMZY 2012-02-01
  • 打赏
  • 举报
回复
在这里我想补充个问题,我在GridView中绑定一个选择列,这个选择列是一个按钮,我想通过点击每一行的按钮,在rowCommand事件中,获取改行的某个特定单元格的值,这个该如何实现呢?
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
你可以通过客户端的html去得到,放在隐藏域里面去提交
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
是的, 你都要多加个else if啊
else if (x is CheckBox)
...
else if (x is Pannel)
\...
else if (x is HtmlInput)
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
你好,net_lover,首先先感谢你的帮忙!!
你上面可以是一种解决办法,但你可有想过.现在你例出:
Control x = row.Cells[i].Controls[j];
if (x is HyperLink && ((HyperLink)x).Text.Trim() !="")
{
Response.Write(((HyperLink)x).Text + "||");
}
else if (x is Literal && ((Literal)x).Text.Trim() != "")
{
Response.Write(((Literal)x).Text + "||");
}
else if (x is Label)
{
Response.Write(((Label)x).Text + "||");
}
这三种控件.那可能还要其它的.如TestBox,CheckBox等.我们可能这样做会少了很多其它控件.所以我想的是能不能不管它是什么控件.就得到该单元格的第一个控件的Text属性.
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
如果是那样,那你必须进行判断类型了,因为不是所有的控件都显示内容的。
<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// 计算数据,完全可以从数据库取得
System.Data.DataTable CreateDataSourceByXianhuiMeng()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("aa", typeof(System.Int32)));
dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = i;
dr[1] = "xxx" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = this.CreateDataSourceByXianhuiMeng();
GridView1.DataBind();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
for (int j = 0; j < row.Cells[i].Controls.Count; j++)
{
Control x = row.Cells[i].Controls[j];
if (x is HyperLink && ((HyperLink)x).Text.Trim() !="")
{
Response.Write(((HyperLink)x).Text + "||");
}
else if (x is Literal && ((Literal)x).Text.Trim() != "")
{
Response.Write(((Literal)x).Text + "||");
}
else if (x is Label)
{
Response.Write(((Label)x).Text + "||");
}
}
}
Response.Write("<hr/>");
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal ID="x" runat="server" Text='<%#Eval("Name") %>'></asp:Literal>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink ID="h" runat="server" NavigateUrl="~/aa.aspx">Lxx</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="测试" OnClick="Button1_Click" />
</form>
</body>
</html>
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
现在主要的问题是 </asp:TemplateField>里放什么控件是动态的。如:
<asp:TemplateField HeaderText="A/C No." SortExpression="ACNo">
<ItemTemplate>
<span>
<%#Eval("ACNo")%></span>
</ItemTemplate>
<asp:TemplateField HeaderText="Company" SortExpression="Company">
<ItemTemplate>
<asp:HyperLink ID="LinkCompany" runat="server"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>我是要在控件不确定的情况下获取值。
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
例子
<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// 计算数据,完全可以从数据库取得
System.Data.DataTable CreateDataSourceByXianhuiMeng()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("aa", typeof(System.Int32)));
dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = i;
dr[1] = "xxx" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = this.CreateDataSourceByXianhuiMeng();
GridView1.DataBind();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
Response.Write((row.FindControl("x") as Literal).Text + " || ");
Response.Write((row.FindControl("Label1") as Label).Text + " || ");
Response.Write("<hr/>");
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal ID="x" runat="server" Text='<%#Eval("Name") %>'></asp:Literal>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="测试" OnClick="Button1_Click" />
</form>
</body>
</html>
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
TemplateField你就去FindControl啊
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
我两种方法.我都试了.不行啊!返回值为值.
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
不是给你贴了2种方法吗?#1,#2楼
你都看啥了?不仔细看回复能解决?
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 net_lover 的回复:]
方法2

C# code

protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
……
[/Quote]你说的是这方法是吧.不行.
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
2种情况都给你解释了,你没看清楚吗》?
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
楼上这种情况只适合oGV.Columns[j] is BoundField这种情况.当oGV.Columns[j] is TemplateField就没有用了.
blncle 2011-09-26
  • 打赏
  • 举报
回复
string str="":

foreach (GridViewRow row in this.gvd1.Rows)
{
str = row.Cells[1].Text;
}
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
你要是不会弄,直接存储下面的内容为xx.aspx浏览看效果
<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// 计算数据,完全可以从数据库取得
System.Data.DataTable CreateDataSourceByXianhuiMeng()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("aa", typeof(System.Int32)));
dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = i;
dr[1] = "xxx" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = this.CreateDataSourceByXianhuiMeng();
GridView1.DataBind();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{

for (int i = 0; i < row.Cells.Count; i++)
{
Response.Write(row.Cells[i].Text + " || ");
}
Response.Write("<hr/>");
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="测试" OnClick="Button1_Click" />
</form>
</body>
</html>
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
完整的例子,你要是不会弄,就直接拷贝下面的代码存储xx.aspx,直接浏览即可


<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// 计算数据,完全可以从数据库取得
System.Data.DataTable CreateDataSourceByXianhuiMeng()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("aa", typeof(System.Int32)));
dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = i;
dr[1] = "xxx" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = this.CreateDataSourceByXianhuiMeng();
GridView1.DataBind();
}
}

protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
Response.Write(row.Cells[i].Text);
}
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="测试" OnClick="Button1_Click" />
</form>
</body>
</html>
xieganlin 2011-09-26
  • 打赏
  • 举报
回复
楼上说的方法我也试了.row.Cells[i].Text返回值为Null啊
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
方法2
  protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
Response.Write(row.Cells[i].Text);
}
}
}


这种方法适用于 AutoGenerateColumns="true"的情况
孟子E章 2011-09-26
  • 打赏
  • 举报
回复
 protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
for (int i = 0; i < GridView1.Columns.Count; i++)
{
Response.Write(row.Cells[i].Text);
}
}
}


这种方法适用于 AutoGenerateColumns="false" 的情况
一、表头表尾 1、自定义多行表头,列合并,行合并 2、删除表身指定列、行 3、固定表头,向下拉动滚动条时,表头固定不动 4、表脚行统计,总计、平均 二、导入导出 1、导出Excel,Word 2、导入Excel 三、多层嵌套 1、在父GridView的编辑模板嵌套一个子GridView 2、三层GridView嵌套 四、分页排序 1、分页 2、列排序,点击列升序、降序排序 五、结合控件 1、CheckBox控件,多选、全选 2、DropDownList控件 3、隐藏控件,当选择处理状态选备注时,隐藏textbox显示 4、radio控件,选获取GridView表主键 5、GridViewDropDownList绑定数据,直接绑定显示,无需点击编辑按纽。 6、JavaScript操作checbox实现全选,多选 六、设置属性 1、JavaScript设置GridView行的背景颜色,单偶行的背景颜色,鼠标停留行背景,鼠标选时的行背景 2、GridView的JavaScript的行单击,双击、删除提示框、快捷键事件 3、GridView设置属性,单元格文本颜色,单元格背景颜色,表增加空行 七、无代码 GridView排序、发送邮件、点击行查看详情,内容过长截取 八、选增删改 1、GridView自带的选、编辑、删除,即CommandField 2、GridView添加记录,在GridView表脚添加控件,用添加记录 3、更新所有记录,GridView直接绑定控件,然后更新 九、主键索引 根据主键多条记录删除,单条记录删除。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧