大家好!
我在gridview中,嵌入了html的input(checkbox),代码在最下面。现在碰到一个问题,我想读出哪些行被选中,但是在后台无法获取前台的checkbox,我把checkbox置为服务器端控件,用CheckBox ck = gvr.FindControl("selectItem") as CheckBox;语句提取复选框,但是报错“未将对象引用设置到对象的实例。”
请大家帮帮忙,谢谢!
代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>    <script type="text/javascript">
        
        function selAll(obj)
        {
            var state;
            
            if(obj.checked==true)
            {
                state = true;
            }
            else
            {
                state = false;
            }            var inputs=document.getElementById("GridView1").getElementsByTagName("input");
            
            for(var i=1;i<inputs.length;i++)
            {
                if(inputs[i].type="checkbox")
                {
                    inputs[i].checked=state;
                }
            }
        }
   
        function selectHeader()
        {
            var state=true;
            var inputs=document.getElementById("GridView1").getElementsByTagName("input");
            var header=document.getElementById("selectAll");
            
            for(var i=0;i<inputs.length;i++)
            {
                if(inputs[i].type=="checkbox" && inputs[i].id!="selectAll" && !inputs[i].checked)
                {
                    state=false;
                    break;
                }
            }
            header.checked=state;
        }    </script></head>
<body>
    <form id="form1" runat="server">
        <div>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="帐号"
                DataSourceID="SqlDataSource1" EmptyDataText="没有可显示的数据记录。">
                <Columns>
                    <asp:BoundField DataField="帐号" HeaderText="帐号" ReadOnly="True" SortExpression="帐号" />
                    <asp:BoundField DataField="余额" HeaderText="余额" SortExpression="余额" />
                    <asp:TemplateField>
                        <HeaderTemplate>
                            <input id="selectAll" type="checkbox" onclick="selAll(this)" />
                        </HeaderTemplate>
                        <ItemTemplate>
                            <input id="selectItem" runat="server" type="checkbox" onclick="selectHeader()" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:测试数据库ConnectionString1 %>"
                DeleteCommand="DELETE FROM [帐户] WHERE [帐号] = @帐号" InsertCommand="INSERT INTO [帐户] ([帐号], [余额]) VALUES (@帐号, @余额)"
                ProviderName="<%$ ConnectionStrings:测试数据库ConnectionString1.ProviderName %>" SelectCommand="SELECT [帐号], [余额] FROM [帐户]"
                UpdateCommand="UPDATE [帐户] SET [余额] = @余额 WHERE [帐号] = @帐号">
                <DeleteParameters>
                    <asp:Parameter Name="帐号" Type="String" />
                </DeleteParameters>
                <InsertParameters>
                    <asp:Parameter Name="帐号" Type="String" />
                    <asp:Parameter Name="余额" Type="Int32" />
                </InsertParameters>
                <UpdateParameters>
                    <asp:Parameter Name="余额" Type="Int32" />
                    <asp:Parameter Name="帐号" Type="String" />
                </UpdateParameters>
            </asp:SqlDataSource>
            &nbsp;<br />
            &nbsp;<asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="OK" />
            <br />
            <asp:Label ID="Label4" runat="server"></asp:Label></div>
    </form>
</body>
</html>

解决方案 »

  1.   

    gvr.rows[i].FindControl("selectItem")//具体到行gvr.rows[i]
      

  2.   

                string newsid = "";
                foreach (GridViewRow gvr in GridView1.Rows)
                {
                    CheckBox ch = (CheckBox)gvr.FindControl("ItemCheckBox");
                    if (ch.Checked)
                    {
                        newsid += GridView1.DataKeys[gvr.DataItemIndex].Value.ToString() + ",";
                    }
                }
      

  3.   

    selectItem是一个html控件,我把它置为作为服务器端控件。但是FindControl("selectItem")这个方法是有问题的。
    运行时报错“无法将类型为“System.Web.UI.HtmlControls.HtmlInputCheckBox”的对象强制转换为类型“System.Web.UI.WebControls.CheckBox”。”
      

  4.   

    System.Web.UI.HtmlControls.HtmlInputCheckBoxck = gvr.FindControl("selectItem") as System.Web.UI.HtmlControls.HtmlInputCheckBoxPS:你写的JS有问题的
    var header=document.getElementById("selectAll"); 
    是得不到全选的复选框的
    应该是这个document.getElementById("GridView1_ctl01_selectAll"); 
      

  5.   


    ///删除事件
         function delFun()
         {
            var ckbList  = [];
            var grid = document.getElementById("GridView1");
            if(grid == null)
            {
                alert("还没有任何记录");
                return;
            }
            if(confirm('是否要删除所选择的信息?'))
            {
                var isCheck = false;            var checkBoxs = grid.getElementsByTagName('INPUT');
                for(var i=0;i<checkBoxs.length;i++) 
                {
        if(checkBoxs[i].type=='checkbox')
        {
            if(checkBoxs[i].checked)
            {
                isCheck = true;
                                        ckbList[ckbList.length] = checkBoxs[i];
                break;
            }
        }
        }
        if(isCheck)
        {
            __doPostBack('btnDel','')
        }
        else
        {
            alert("请选择要删除的记录!");
            return false;
        }
            }
          }
      

  6.   

    用request.form获取值,然后在split分割下放到数组里