如何访问列表视图中的复选框?
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();
}
}
我正在尝试以 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();
}
}