自从最近几个小时以来我一直坚持这个错误..我不知道我在这里做错了什么..
<script type="text/javascript">
function viewProfile(index)
{
var GridID = document.getElementById("PersonGridView");
var row=GridID.rows[parseInt(index)+1];
window.open('detailsid.aspx?'+row);
}
</script>
<Columns>
<asp:BoundField HeaderText="First Name" DataField="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField = "LastName" />
<asp:BoundField HeaderText="HomePhoneNumber" DataField="HomePhoneNumber" />
<asp:TemplateField HeaderText="ViewDetails">
<ItemTemplate>
<asp:Button ID="Deatils" runat="server" Text="Details" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Actions">
<ItemTemplate>
<asp:Button ID="Modify" runat="server" Text="Modify" />
<asp:Button ID="Delete" runat="server" Text="Delete" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#CCCC99" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
</div>
</form>
<p> Code Behind :
protected void PersonGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString();
Button btnDetails = (Button)FindControl("Details");
Button btnModify = (Button)FindControl("Modify");
Button btnDelete = (Button)FindControl("Delete");
btnModify.CommandName = "Modify";
btnDelete.CommandName = "Delete";
btnDetails.CommandName = "Details";
btnDelete.CommandArgument = btnModify.CommandArgument = string.Format("{0}", ID);
btnDetails.Attributes["onclick"] = string.Format("viewProfile({0}); return false;", ID);
}
}
答案 0 :(得分:2)
更改
var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString();
if (e.Row.RowType == DataControlRowType.DataRow)
{
到
if (e.Row.RowType == DataControlRowType.DataRow)
{
var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString();
即。仅当行是DataRow而不是Header / Footer等时才提取DataKeys。
答案 1 :(得分:0)
这是抛出错误的行吗?:
var ID = PersonGridView.DataKeys[e.Row.RowIndex]["ID"].ToString();
这一行在两个不同的地方按索引引用数组项,因此您需要进行一些调试以确定哪个是问题。基本上,PersonGridView.DataKeys[]
没有与e.Row.RowIndex
匹配的索引,或者该项没有与"ID"
匹配的索引。您需要逐步调试调试器以在运行时检查这些值,或者在一些调试代码(Response.Write
语句中进行检查,然后检查值)以查看正在发生的事情。
一个常见错误是DataGridView
在非数据行上运行此代码。页眉,页脚等。您可以扩展if
语句的范围来解决这个问题。在条件而不是在条件之外引用索引。
修改(以回应您的评论)
btnDetails
是否设置为对象的实例?我猜它不是。您需要继续调试并查看您尝试查找的控件是否确实存在。我注意到它与其他按钮分开ItemTemplate
和TemplateField
。这可能导致问题吗?我并不完全熟悉这些服务器控件,所以我不确定是否可以使用。
我应该花点时间指出你的代码非常脆弱。您遇到的问题就是这样的结果。您手动引用索引数组,包括使用“魔术字符串”来引用它们。你可能想要为此进行一些错误检查。你也在投射并稍后使用对象而不检查它们是否存在。 FindControl
可以非常轻松地返回null
引用,例如未找到控件时。
投入大量错误检查是使用这些Web表单控件及其旧数据绑定方法的现实的一部分。很多额外的代码,但这就是它如何与这些控件一起使用并直接绑定到弱类型的DataSet等。