我在预先填充复选框列表时遇到一些问题,方法是从相同用户的数据库中获取值,需要检查多个复选框。这是我想要的更新配置文件页面,当根据用户在注册时已完成的数据库检查此页面加载多个复选框时。所以,如何做到这一点请我尝试了很多次,但只有最后一个值得到检查其他所有没有得到检查。单个用户可以有多个爱好。因此,复选框列表适用于爱好,当更新页面加载时,已经检查了多个爱好,然后他也可以更新并添加更多爱好。更新我已经完成的部分我只是希望复选框列表预填充用户之前给出的所有值。提前致谢。
这是我的update.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Update.aspx.cs" Inherits="Update" %>
<!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>
</head>
<body>
<form id="form1" runat="server">
<div>
<table class="style1">
<tr>
<td class="style3">
<asp:Label ID="Label2" runat="server" Text="Login Name"></asp:Label>
</td>
<td colspan="2">
<asp:TextBox ID="txtlogin" runat="server" ReadOnly="True"></asp:TextBox>
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
<asp:Label ID="Label4" runat="server" Text="EmailId"></asp:Label>
</td>
<td colspan="2">
<asp:TextBox ID="txtemail" runat="server" ReadOnly="True"></asp:TextBox>
</td>
<td>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="txtemail" Display="Dynamic" ErrorMessage="Invalid"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td class="style3">
<asp:Label ID="Label5" runat="server" Text="Address"></asp:Label>
</td>
<td colspan="2">
<asp:TextBox ID="txtadd" runat="server" TextMode="MultiLine" Width="142px"
ReadOnly="True"></asp:TextBox>
</td>
<td>
</td>
</tr>
<tr>
<td class="style6">
<asp:Label ID="Label6" runat="server" Text="City"></asp:Label>
</td>
<td colspan="2" class="style7">
<asp:DropDownList ID="ddlcity" runat="server" Height="21px" Width="142px"
Enabled="False">
</asp:DropDownList>
</td>
<td class="style7">
</td>
</tr>
<tr>
<td class="style3">
<asp:Label ID="Label7" runat="server" Text="Pincode"></asp:Label>
</td>
<td colspan="2">
<asp:TextBox ID="txtpin" runat="server" ReadOnly="True" ></asp:TextBox>
</td>
<td>
<asp:RegularExpressionValidator ID="regexpin" runat="server"
ControlToValidate="txtpin" ErrorMessage="Numbers only(six digits)"
ValidationExpression="[0-9]{6}"></asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td class="style3">
<asp:Label ID="Label8" runat="server" Text="PaymentMode"></asp:Label>
</td>
<td colspan="2">
<asp:RadioButtonList ID="rbtnlstpay" runat="server" Height="28px" Width="225px"
Enabled="False">
</asp:RadioButtonList>
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
<asp:Label ID="Label9" runat="server" Text="Hobbies"></asp:Label>
</td>
<td colspan="2">
<asp:CheckBoxList ID="cblsthobbies" runat="server" Width="128px"
Enabled="False">
</asp:CheckBoxList>
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td class="style5" colspan="2">
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td>
<asp:Button ID="btnedit" runat="server" Text="Edit"
onclick="btnedit_Click" />
</td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td class="style4">
</td>
<td class="style2" colspan="2">
<asp:Label ID="lblresult" runat="server"></asp:Label>
</td>
<td class="style2">
</td>
</tr>
<tr>
<td class="style4">
</td>
<td class="style2" colspan="2">
</td>
<td class="style2">
</td>
</tr>
<tr>
<td class="style3">
</td>
<td colspan="2">
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td colspan="2">
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td colspan="2">
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td colspan="2">
</td>
<td>
</td>
</tr>
<tr>
<td class="style3">
</td>
<td colspan="2">
</td>
<td>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
这是我的update.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
public partial class Update : System.Web.UI.Page
{
DataSet ds = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SqlConnection cn = new SqlConnection();
cn.ConnectionString = @"Data Source=.;Initial Catalog=UserRecords;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "select * from CityMaster;select * from HobbyMaster;select * from PaymentModeMaster;select * from Users where LoginId = @Loginid;select * from UsersHobbies where LoginId = @Loginid";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Loginid",Session["loginid"].ToString());
cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
ddlcity.Items.Add(new ListItem(dr["CityName"].ToString(), dr["CityId"].ToString()));
}
dr.NextResult();
while (dr.Read())
{
cblsthobbies.Items.Add(new ListItem(dr["Hobbyname"].ToString(), dr["HobbyId"].ToString()));
}
dr.NextResult();
while (dr.Read())
{
rbtnlstpay.Items.Add(new ListItem(dr["PaymentModename"].ToString(), dr["PaymentModeId"].ToString()));
}
dr.NextResult();
while (dr.Read())
{
txtlogin.Text = dr["LoginId"].ToString();
txtemail.Text = dr["EmailId"].ToString();
txtadd.Text = dr["Address"].ToString();
txtpin.Text = dr["Pincode"].ToString();
ddlcity.SelectedValue = dr["CityId"].ToString();
rbtnlstpay.SelectedValue = dr["PaymentModeId"].ToString();
}
dr.NextResult();
while (dr.Read())
{
for(int i = 0; i < dr.FieldCount; i++)
{
cblsthobbies.SelectedValue = dr["HobbyId"].ToString();
//cblsthobbies.SelectedValue = dr.GetValue(1).ToString();
}
}
cn.Close();
}
}
protected void btnedit_Click(object sender, EventArgs e)
{
txtemail.ReadOnly = false;
txtadd.ReadOnly = false;
ddlcity.Enabled = true;
txtpin.ReadOnly = false;
rbtnlstpay.Enabled = true;
cblsthobbies.Enabled = true;
btnedit.Text = "Update";
}
}
答案 0 :(得分:2)
看起来这是您尝试设置检查状态的地方:
for(int i = 0; i < dr.FieldCount; i++)
{
cblsthobbies.SelectedValue = dr["HobbyId"].ToString();
//cblsthobbies.SelectedValue = dr.GetValue(1).ToString();
}
但是,这并未设置CheckBoxList
中各个项目的选中状态。这只是为列表本身设置整体SelectedValue
。并且因为只有一个这样的值,所以通过循环的每次迭代都会覆盖前一个值。因此,只剩下最后一个。
要设置选中状态,您必须为上一个记录集中的每条记录找到单独的复选框。也许是这样的:
for(int i = 0; i < dr.FieldCount; i++)
{
cblsthobbies.Items.FindByValue(dr["HobbyId"].ToString()).Selected = true;
}
答案 1 :(得分:0)
循环遍历cblsthobbies.Items集合并设置每个项目的Selected属性值
foreach (var i in cblsthobbies.Items)
{
i.Selected = i.SelectedValue == dr["HobbyId"].ToString();
}
答案 2 :(得分:0)
不是有两个嵌套循环 - 一个用于所有可能的选择,然后是一个嵌套的循环来查找先前选择的每一个 - 我喜欢先阅读先前选择的选择并将它们存储在Hashtable中,然后只迭代CheckBoxList中已有的所有项目,如果在Hashtable中找到它,则选择一项。这有两个好处:
首先,我在.aspx中单独构建复选框列表
<asp:SqlDataSource runat="server" ID="dsHobbies"
SelectCommand="SELECT iHobbyID, sHobbyName FROM tblHobby">
</asp:SqlDataSource>
<asp:CheckBoxList runat="server" ID="cblHobbies" DataSourceID="dsHobbies" DataValueField="iHobbyID" DataTextField="sHobbyName "></asp:CheckBoxList>
然后,用于读取先前保存的选择并填充CheckBoxList的代码如下所示:
// read previously chosen items from database
string sql = "SELECT * FROM tblSelectedHobbies WHERE iPersonID=@pPersonID";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = myConnStr;
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("pPersonID", id); // id from query string, or wherever
SqlDataReader reader = cmd.ExecuteReader();
// iterate through saved entries and add to Hashtable
Hashtable savedEntries = new Hashtable();
while (reader.Read())
{
string hobbyID= reader["iHobbyID"].ToString();
savedEntries[hobbyID] = true;
}
conn.Close();
// check the corresponding boxes
dsHobbies.DataBind();
cblHobbies.DataBind();
foreach (ListItem li in cblHobbies.Items)
{
if (savedEntries.ContainsKey(li.Value))
{
li.Selected = true;
}
}