你调用的对象是空的

时间:2011-02-22 19:46:56

标签: javascript asp.net

自从最近几个小时以来我一直坚持这个错误..我不知道我在这里做错了什么..

    <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);


            }
        }

2 个答案:

答案 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是否设置为对象的实例?我猜它不是。您需要继续调试并查看您尝试查找的控件是否确实存在。我注意到它与其他按钮分开ItemTemplateTemplateField。这可能导致问题吗?我并不完全熟悉这些服务器控件,所以我不确定是否可以使用。

我应该花点时间指出你的代码非常脆弱。您遇到的问题就是这样的结果。您手动引用索引数组,包括使用“魔术字符串”来引用它们。你可能想要为此进行一些错误检查。你也在投射并稍后使用对象而不检查它们是否存在。 FindControl可以非常轻松地返回null引用,例如未找到控件时。

投入大量错误检查是使用这些Web表单控件及其旧数据绑定方法的现实的一部分。很多额外的代码,但这就是它如何与这些控件一起使用并直接绑定到弱类型的DataSet等。