1

私はこれを使用して1つのチェックボックスを選択された列に選択しますこれを複数のチェックボックスリストから単一の列に変換する方法私は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();
    }
4

4 に答える 4

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 列を結合するのではなく使用することをお勧めします。

于 2010-08-04T17:16:50.643 に答える
1

個人的には、そのようにはしません。デザインが悪いのです。すべての値を 1 つの列に詰め込もうとするのではなく、そこにすべての値を含む別のテーブルを作成します。

それらをintに変換してコンマで区切ることができますか

例えば。1,0,0,1,1など

于 2010-08-04T17:06:42.890 に答える
0

ビットマスクの使用を検討しましたか? 以下は、選択したカテゴリを例として使用した説明です (カテゴリがあなたの状況で機能するかどうかはわかりませんが、概念を示しています)。

各値に 1 つの 2 進数を割り当てることから始めます。

cat1  cat2  cat3 cat4
----  ----  ---- ----
1     2     4    8

次に、メイン テーブルに整数列を追加します。これをオプションと呼びます。数値が 2 進数に変換されると、各桁はカテゴリ 1、2、3、または 4 が設定されているかどうかを表します。例:

5 = バイナリの 0101 = cat1 が設定され、cat2 が設定されず、cat3 が設定され、cat4 が設定されない

id | name         | options
---------------------------
1  | name1        | 5
2  | name2        | 2
3  | name3        | 7
4  | name4        | 6

オプション列に対してビット単位の操作を使用して、許可されているオプションを決定できるようになりました。例:

他のカテゴリを気にしない場合に、カテゴリ 2 が設定されているすべてのレコードを取得するには、次の操作を実行します。

2 & オプション = 2

これにより、レコード 2、3、および 4 が返されます。


cat2 と cat3 が設定されているすべてのレコードを取得するには、次のビット演算を実行します。

6 & オプション = 6

これにより、レコード 3 と 4 が返されます。


カテゴリ 1 と 3 が設定されているすべてのレコードを取得するには、次のビット演算を実行します。

5 & オプション = 5

これにより、レコード 1 と 3 が返されます。


カテゴリ 3 セットのみ:

4 | オプション = 4


カテゴリ 3 未設定:

4 & オプション = 0


これはおそらく理解するのが難しい概念なので、質問があればお知らせください。コンセプトを理解すれば、それがあなたがやろうとしていることを達成する最も簡単な方法かもしれないと私には思えます.

于 2010-08-04T18:07:06.487 に答える
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>");
}
于 2013-03-28T17:46:56.937 に答える