如何访问列表视图中的复选框?

How do I access the checkbox in listview?

我正在尝试以 FindControl 的形式访问 ID,但它没有 return 值,因此出现对象未实例化错误。 我怎样才能访问它的ID? 我已经尝试了几件事,到目前为止我不知道如何解决这个问题。 PS:我是 C# 编程新手

ASP.NET

<ItemTemplate >
                                            <tr id="item" runat="server" class="row">
                                                <td class="first">
                                                    <asp:Label ID="lblNumero_titulo" runat="server" Text='<%# Eval("numero_titulo") %>' /><br />
                                                </td>
                                                <td><%# Eval("razao_social") %></td>
                                                <td><%# Eval("hora_entrega")%></td>
                                                <td><%# Eval("quem_recebeu")%></td>
                                                <td>
                                                    <asp:CheckBox ID="testecb" runat="server" /> </td>
                                                <td>
                                                    <asp:Label ID="lblCodEntrega"Visible="false" runat="server" Text='<%# Eval("cod_entrega") %>' /><br />
                                                </td>                                                  
                                            </tr>
                                        </ItemTemplate>

C#

protected void btnPesquisar_Click(object sender, EventArgs e)
    {
        limpaCampos();
        using (PrincipalDataContext pdc = new PrincipalDataContext())
        {

            if (!string.IsNullOrEmpty(txtCodRomaneio.Text))
            {
                var romaneios = pdc.z_stp_anb_transp_receb(Convert.ToInt32(txtCodRomaneio.Text)).ToList();
                var r = romaneios.First();
                var check = lvNotas.FindControl("testecb") as CheckBox;

                if (romaneios != null)
                {

                    if (r.status == 1)
                    {
                       check.Checked = true;
                       check.Enabled = false;

                    }

                    lvNotas.DataSource = romaneios;
                    lvNotas.DataBind();
                }
                else
                {
                    ScriptManager.RegisterStartupScript(this, typeof(Page), UniqueID, "alert('Romaneio não encontrado!')", true);
                }
            }
        }
    }
The way you get/grab the check box is a list view is like this:

标记:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" >
        <ItemTemplate>
            <tr style="">
                <td><asp:Label ID="First" runat="server" Text='<%# Eval("FirstName") %>' /></td>
                <td><asp:Label ID="Last" runat="server" Text='<%# Eval("LastName") %>' />
                </td>
                <td><asp:Label ID="Hotel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
                <td><asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' /></td>

                <td align="center">
                    <asp:CheckBox ID="CheckBox1" runat="server" />
                </td>

            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table id="itemPlaceholderContainer" runat="server" border="0" class="table table-hover">
                <tr runat="server" style="">
                    <th runat="server">FirstName</th>
                    <th runat="server">LastName</th>
                    <th runat="server">HotelName</th>
                    <th runat="server">City</th>
                    <th runat="server">Select</th>
                </tr>
                <tr id="itemPlaceholder" runat="server">
                </tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>
        <asp:Button ID="Button1" runat="server" CssClass="btn-info" Height="38px" Text="Show checked" Width="130px" OnClick="Button1_Click" />
        <br />

所以我们现在看到这个:

所以我们可以按照上面的方法勾选几个复选框。

现在,按钮代码 see/view/get/grab/work 与所选行?

这个:

   protected void Button1_Click(object sender, EventArgs e)
    {
        {
            foreach (ListViewDataItem lvRow in ListView1.Items)
            {
                CheckBox chBox = (CheckBox)lvRow.FindControl("CheckBox1");

                Debug.Print("Row = " + lvRow.DataItemIndex + ", " + "PK id = " 
                    + ListView1.DataKeys[lvRow.DataItemIndex]["ID"] + ", " 
                    + "Checked = " + chBox.Checked);
            }
        }

    }

输出:

Row = 0, PK id = 73, Checked = True
Row = 1, PK id = 72, Checked = True
Row = 2, PK id = 153, Checked = True
Row = 3, PK id = 95, Checked = False
Row = 4, PK id = 144, Checked = False
Row = 5, PK id = 102, Checked = False
Row = 6, PK id = 82, Checked = False
Row = 7, PK id = 76, Checked = False
Row = 8, PK id = 107, Checked = False
Row = 9, PK id = 108, Checked = False

非常仔细地注意我们如何不在显示或标记中包含数据库 PK 值(使用数据键集合)。这很好,从那时起我们不必显示,甚至不必在列表视图中包含数据库 PK 值(ID),但我们可以自由 get/grab 该 PK 值。

所以上面显示了如何处理(获取)选中的行。我们当然可以将按钮移动到列表视图行,并在给定的行上进行一键单击操作 - 但您的问题没有在标记中显示按钮单击,所以我认为您不想要一键单击获得一行 - 但你可以这样做(如果你 place/have 在列表视图的每一行上都有一个按钮)。

加载 lv 的代码是这样的:

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        LoadGrid();
        }
    }

    void LoadGrid()
    {

        using (SqlCommand cmdSQL = new SqlCommand("SELECT TOP 10 * from tblHotels ORDER BY HotelName ",
            new SqlConnection(Properties.Settings.Default.TEST4)))
        {
            cmdSQL.Connection.Open();
            ListView1.DataSource = cmdSQL.ExecuteReader();
            ListView1.DataBind();
        }
    }