我用它来选择一个复选框到isselected列 我如何将其转换为多个复选框列表到单个列 我使用超过3天的方式没有成功
private void BindCheckBoxList()
{
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetConnectionString());
try
{
connection.Open();
string sqlStatement = "SELECT * FROM boby";
SqlCommand sqlCmd = new SqlCommand(sqlStatement, connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt);
if (dt.Rows.Count > 0)
{
CheckBoxList1.RepeatColumns = 4; // set the number of columns in the CheckBoxList
CheckBoxList1.DataSource = dt;
CheckBoxList1.DataTextField = "Name"; // the items to be displayed in the list items
CheckBoxList1.DataValueField = "Name"; // the id of the items displayed
CheckBoxList1.DataBind();
//Setting the Selected Items in the ChecBoxList based from the value in the database
//to do this, lets iterate to each items in the list
for (int i = 0; i < dt.Rows.Count; i++)
{
if (!string.IsNullOrEmpty(dt.Rows[i]["IsSelected"].ToString()))
{
CheckBoxList1.Items[i].Selected = Convert.ToBoolean(dt.Rows[i]["IsSelected"]);
}
}
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Fetch Error:";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
connection.Close();
}
}
private void Update(string name, bool isSelected)
{
SqlConnection connection = new SqlConnection(GetConnectionString());
SqlCommand cmd;
string sqlStatement = string.Empty;
try
{
connection.Open();
sqlStatement = "UPDATE handymen SET IsSelected = @IsSelected WHERE Name = @BizName";
cmd = new SqlCommand(sqlStatement, connection);
cmd.Parameters.AddWithValue("@Name", name);
cmd.Parameters.AddWithValue("@IsSelected", isSelected);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert/Update error";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
connection.Close();
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindCheckBoxList();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string str = string.Empty;
for (int i = 0; i < CheckBoxList1.Items.Count; i++)
{
if (CheckBoxList1.Items[i].Selected)
{
str = CheckBoxList1.Items[i].Text;
Update(str, CheckBoxList1.Items[i].Selected);
}
}
//ReBind the List to retain the selected items on postbacks
BindCheckBoxList();
}
答案 0 :(得分:2)
好吧,如果你打算这样做,最好的方法是将它们组合成一个按位合成,也许是这样:
int value = 0; //or short or long, depending on the number of bits
int bitDegree = 1; //or short or long, depending on the number of bits
for (int i = 0; i < dt.Rows.Count; i++)
{
if (!string.IsNullOrEmpty(dt.Rows[i]["IsSelected"].ToString())
&& Convert.ToBoolean(dt.Rows[i]["IsSelected"]))
{
value += bitDegree;
}
bitDegree *= 2;
}
但是,如果可以的话,最好在数据库中使用多个Bit列而不是组合它们。
答案 1 :(得分:1)
就我个人而言,我不会这样做,它的设计糟糕。我创建了另一个包含所有值的表,而不是尝试将它们全部填充到一列中。
如果你 ,你可以将它们转换为整数并用逗号分隔吗?
例如。 1,0,0,1,1等
答案 2 :(得分:0)
您是否考虑过使用bit mask?以下是使用所选类别作为示例的解释(不确定类别是否适用于您的情况,但它说明了概念):
首先为每个值分配一个二进制数字 -
cat1 cat2 cat3 cat4
---- ---- ---- ----
1 2 4 8
接下来,您将向主表添加一个整数列,我们将其称为选项。当数字转换为二进制时,每个数字将表示是否设置了类别1,2,3或4。例如:
5 = 0101 in binary = cat1设置,cat2未设置,cat3设置,cat4未设置
id | name | options
---------------------------
1 | name1 | 5
2 | name2 | 2
3 | name3 | 7
4 | name4 | 6
我们现在可以对options列使用按位运算来确定允许的选项。例子:
要在不关心其他类别时设置所有已设置类别2的记录,请执行以下操作:
2&amp; options = 2
这将返回记录2,3和4。
要获取设置了cat2和cat3的所有记录,我们将执行以下按位操作:
6&amp; options = 6
这将返回记录3和4
要获取具有类别1和3的所有记录,我们将执行以下按位操作:
5&amp; options = 5
这将返回记录1和3。
仅限第3类:
4 |选项= 4
类别3未设置:
4&amp; options = 0
这可能是一个难以掌握的概念,所以如果您有任何疑问,请告诉我。在我看来,一旦掌握了这个概念,它可能是完成你想要做的事情的最简单方法。
答案 3 :(得分:0)
试试这个
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=ANSA-PC\\SQLEXPRESS;Initial Catalog=pms;Integrated Security=True");
String str = "";
for (int i = 0; i <=CheckBoxList1.Items.Count-1; i++)
{
if (CheckBoxList1.Items[i].Selected)
{
if (str == "")
{
str = CheckBoxList1.Items[i].Text;
}
else
{
str += "," + CheckBoxList1.Items[i].Text;
}
}
}
con.Open();
SqlCommand cmd = new SqlCommand("insert into aa(a)values('" +str + "')", con);
cmd.ExecuteNonQuery();
ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('ansari:u also got it')</script>");
}