需求:WPF的UI界面上有几个多选框,将多选框勾选的数目存在数据库中。
实现:(希望以每一个bit位来表示是否勾选)即一个字节8位,每bit 1或0,以bit来表示是否勾选。
(数据库字段是varbinary或者binary,ef层面上是Byte[] )
参考:http://www.runoob.com/csharp/csharp-bitarray.html
参考:https://blog.youkuaiyun.com/lassewang/article/details/52240972#commentBox
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
//假设UI界面上一共9个多选框(1 0 1 0 1 1 0 0 1,其中 1 表示勾选 ,0 表示为未勾选)
//9个多选框的绑定数据源分别是9个bool型,所以,将9个bool值,在一个数据中
bool[] checkboxs = { true, false, true, false, true, true, false, false,true};
//将9个勾选项由bool转成BitArray,1个字节8bit,那么在转成byte时,bit的位数应该的8的倍数,
//所有bool转bit前,先凑8的倍数,对于此项目,则前9个bool不变,后面凑7个false
bool[] convertCheckboxs = ConvertByteBools(checkboxs);
//bool to bit 并传给服务端
BitArray booltoBitArray = new BitArray(convertCheckboxs);
//到了服务端,将BitArray to byte[]
Byte[] tempBytes = new byte[convertCheckboxs.Length / 8];//算一下我们的bit数组一共几个字节
//checkbox为ef层面上的数据库字段对象映射,数据库中为varbinary,ef为byte[]
//dbcheckbox.checkbox =tempBytes;将tempBytes传给ef,准备存储数据库中dbcheckbox.checkbox为Byte[]
Byte[] checkbox = GetData(booltoBitArray, tempBytes);
//现在从数据中取数据转成bool型,先将byte to bit 并将BitArray数据传给客户端
BitArray checkBitArray = new BitArray(checkbox);//byte to bit
//到了客户端
//下面是涉及大端小端的东西,那块知识我学的不好,我是看具体实现去调整代码...........
bool[] checkTemps = new bool[checkBitArray.Length];
for (int i = 0; i < checkBitArray.Length; i++)
{
checkTemps[i] = checkBitArray[i];
}
//从前往后每8个倒一次顺序
for (int i = 0; i < checkTemps.Length; i = i + 8)
{
Array.Reverse(checkTemps, i, 8);
}
// 将调整好的数组在copy给之前的checkboxs
Array.Copy(checkTemps, checkboxs, checkboxs.Length);
foreach (var singlebox in checkboxs)
{
Console.WriteLine(singlebox.ToString());
}
}
static public byte[] GetData(BitArray bitData, byte[] data)
{
for (int i = 0, y = 0; i < bitData.Length / 8; i++)
{
data[i] = 0;
if (bitData[y])
data[i] |= (byte)(1 << 7);
if (bitData[y + 1])
data[i] |= (byte)(1 << 6);
if (bitData[y + 2])
data[i] |= (byte)(1 << 5);
if (bitData[y + 3])
data[i] |= (byte)(1 << 4);
if (bitData[y + 4])
data[i] |= (byte)(1 << 3);
if (bitData[y + 5])
data[i] |= (byte)(1 << 2);
if (bitData[y + 6])
data[i] |= (byte)(1 << 1);
if (bitData[y + 7])
data[i] |= (byte)(1);
y += 8;
}
return data;
}
static public bool[] ConvertByteBools(bool[] multicheck)
{
int x = (multicheck.Length % 8);
int y = 8 - x;
bool[] newBools = new bool[multicheck.Length + y];
Array.Copy(multicheck, newBools, multicheck.Length);
for (int i = multicheck.Length; i < newBools.Length; i++)
{
newBools[i] = false;
}
return newBools;
}
}
}
自己写的demo,批判看,后续有时间可以封装下,在写代码时方便点。
大家可以创建一个c#控制台程序,把整段程序copy过去,单步跟一遍看看就清楚了