求教gridview里找控件的问题_gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3]

xiaoxiao20091228 2013-04-16 12:46:52

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1" AllowSorting="True" OnRowCommand="GridView1_RowCommand"
OnRowDataBound="GridView1_RowDataBound" OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:ButtonField Text="SingleClick" CommandName="SingleClick" Visible="False" />
<asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False"
ReadOnly="True" SortExpression="EmployeeID" />
<asp:TemplateField HeaderText="LastName" SortExpression="LastName">
<ItemTemplate>
<asp:Label ID="lblLastName" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>
<asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>' Visible="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="FirstName" SortExpression="FirstName">
<ItemTemplate>
<asp:Label ID="lblFirstName" runat="server" Text='<%# Eval("FirstName") %>'></asp:Label>
<asp:TextBox ID="txtFirstName" runat="server" Text='<%# Eval("FirstName") %>' Visible="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Country" SortExpression="Country">
<ItemTemplate>
<asp:Label ID="lblCountry" runat="server" Text='<%# Eval("Country") %>'></asp:Label>
<asp:DropDownList ID="ddlCountry" runat="server" Visible="False" AutoPostBack="True"
DataSourceID="SqlDataSource1" DataTextField="Country" DataValueField="Country">
</asp:DropDownList><asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT DISTINCT [Country] FROM [Employees]"></asp:SqlDataSource>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>



protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
GridView _gridView = (GridView)sender;

switch (e.CommandName)
{
case ("SingleClick"):
// 获得行索引
int _rowIndex = int.Parse(e.CommandArgument.ToString());
// 解析事件参数(在RowDataBound中增加的),从而获得被选中的列的索引
int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);
// 设置GridView被选中的行的索引(每次回发后判断GridView1.SelectedIndex > -1则更新)
_gridView.SelectedIndex = _rowIndex;
// 绑定
_gridView.DataBind();

// 事件记录
this.Message.Text += "单击GridView的行的索引为:" + _rowIndex.ToString()
+ ";列索引为:" + _columnIndex + "<br />";

// 获得被选中单元格的显示控件并设置其不可见
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];
_displayControl.Visible = false;
// 获得被选中单元格的编辑控件并设置其可见
Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3];
_editControl.Visible = true;
// 清除被选中单元格属性以删除click事件
_gridView.Rows[_rowIndex].Cells[_columnIndex].Attributes.Clear();

// 设置焦点到被选中的编辑控件
ClientScript.RegisterStartupScript(GetType(), "SetFocus",
"<script>document.getElementById('" + _editControl.ClientID + "').focus();</script>");
// 如果编辑控件是DropDownList的话,那么把SelectedValue设置为显示控件的值
if (_editControl is DropDownList && _displayControl is Label)
{
((DropDownList)_editControl).SelectedValue = ((Label)_displayControl).Text;
}
// 如果编辑控件是TextBox的话则选中文本框内文本
if (_editControl is TextBox)
{
((TextBox)_editControl).Attributes.Add("onfocus", "this.select()");
}

break;
}
}

在GridView1_RowCommand里的
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];和
Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3];
分别表示gridview里的哪个控件啊?
            <asp:TemplateField HeaderText="LastName" SortExpression="LastName">
<ItemTemplate>
<asp:Label ID="lblLastName" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>
<asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>' Visible="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>

这明明只有两个控件
Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3];这里怎么会有3呢?
...全文
374 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhr009 2015-07-21
  • 打赏
  • 举报
回复
虽然帖子远旧,我刚好再搞,遇到一样的问题。 那么我来解答吧,好让以后的人可以看到。 首先,UP主的代码写少了一行 没有定义数据源再绑定, 第二,datatable应该是全局的 private static DataTable dt; int columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]); // 设定Gridview选定的索引值 gridView.SelectedIndex = rowIndex; gridView.DataSource = dt; gridView.DataBind(); // Write out a history if the event this.Label1.Text += "Single clicked GridView row at index " + rowIndex.ToString() + " on column index " + columnIndex + "<br />";
小fafa_John 2014-07-31
  • 打赏
  • 举报
回复
同样的问题 // 获得单元格里的控件 Control _displayControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[1]; Control _editControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[3]; controls[3]是什么意思?求高手解答!
xiaoxiao20091228 2013-04-17
  • 打赏
  • 举报
回复
自己顶,高手帮忙看看
xiaoxiao20091228 2013-04-17
  • 打赏
  • 举报
回复
http://www.bluemorning.com.cn:/DotNEt.rar 我把源码放上来 有时间的大侠帮忙看看吧,先谢谢了! 编译后点“针对GridView的某一单元格进行编辑”也就是EditIndividualCell.aspx 在gridview里Employeeid之后加BirthDate,再点击gridview就会出错 如果把birthdate加在Country后面,则是点第二下才出错 都是RowUpdating里的Control _displayControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[1];出错,错误都是超出范围 gridview里要加的birthdate列:
<asp:BoundField DataField="BirthDate" HeaderText="BirthDate" InsertVisible="False" ReadOnly="True" SortExpression="BirthDate" />
xiaoxiao20091228 2013-04-17
  • 打赏
  • 举报
回复
这个源码是个老外很早以前写的单击编辑gridview的功能,也试过了,用findcontrol能获取到textbox控件的值,但是后面要改的东西太多了,根本改不好,只要搞清楚 Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3]就能用了。
阿拉敏敏 2013-04-17
  • 打赏
  • 举报
回复
gridview.Row[i].Cell[index].Text;某行的某列的值,不过注意 他们呢都是从0开始算的。 也可以for循环的了啊
clark_kidd 2013-04-16
  • 打赏
  • 举报
回复
干嘛不用GridView1.Rows[0].findControl(string)?
xiaoxiao20091228 2013-04-16
  • 打赏
  • 举报
回复
引用 7 楼 mickers 的回复:
你这个是知道了生成后的控件状态(名称,Id),这么怎么知道的,我们一般是应FindControl的
下的源代码执行是没有问题的,但是如果改了gridivew的结构,加一列就会出错,所以我想知道到底是怎么回事
mickers 2013-04-16
  • 打赏
  • 举报
回复
你这个是知道了生成后的控件状态(名称,Id),这么怎么知道的,我们一般是应FindControl的
xiaoxiao20091228 2013-04-16
  • 打赏
  • 举报
回复

            <asp:TemplateField HeaderText="LastName" SortExpression="LastName">
                <ItemTemplate>
                    <asp:Label ID="lblLastName" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>
                    <asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>' Visible="false"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
xiaoxiao20091228 2013-04-16
  • 打赏
  • 举报
回复
            <asp:TemplateField HeaderText="LastName" SortExpression="LastName">                <ItemTemplate>                    <asp:Label ID="lblLastName" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>                    <asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>' Visible="false"></asp:TextBox>                </ItemTemplate>            </asp:TemplateField>
假设我点了第一行的第二列,如果要获取txtLastName的值应该怎么写 GridView1.Rows[0].Cells[1].Controls[0]还是GridView1.Rows[0].Cells[1].Controls[1] 还是说GridView1.Rows[0].Cells[1].Controls[0][xxx] 有这种写法吗
gxingmin 2013-04-16
  • 打赏
  • 举报
回复
索引超出范围了,是不是Controls里没有3个啊,还是需要你自己设断点调试才能知道,别人是无法知道的
xiaoxiao20091228 2013-04-16
  • 打赏
  • 举报
回复
引用 2 楼 gxingmin 的回复:
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];和 Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3]; 这些指定哪个控件不好说,你设……
点击<asp:TemplateField HeaderText="LastName"> Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1]就是lblLastName Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3]就是 txtLastName 我是想把这段代码加到我自己的程序里,可是报错,所以想知道这个到底是什么意思 用户代码未处理 System.ArgumentOutOfRangeException Message=索引超出范围。必须为非负值并小于集合大小。 参数名: index Source=mscorlib ParamName=index
gxingmin 2013-04-16
  • 打赏
  • 举报
回复
Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];和 Control _editControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[3]; 这些指定哪个控件不好说,你设个断点,看看它们是什么类型的
njw1028 2013-04-16
  • 打赏
  • 举报
回复
记得_gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[0]指的是_gridView.Rows[_rowIndex].Cells[_columnIndex]本身,LZ可以在后台监控看看嘛。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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