我如何从字典

时间:2016-08-30 22:06:34

标签: c# dictionary checkedlistbox

我有一个Dictionary<string, ValuePair>,其中包含有关我的checkedlistbox控件的先前状态的信息。我想尝试迭代该词典并调整我当前的checkedlistbox来反映这一点。 Dictionary中包含的信息是一个Name作为字符串,它匹配列表框中的项目,因此我可以使用它来调用FindStringExact(),然后ValuePair类包含一个bool值,用于检查该项是否被检查,以及一个整数是该项目之前在列表中的位置的索引值。

如何从该信息中重新设置checkedlistbox?我需要提一下,我的列表框通过DataSource属性绑定到inputData.Cameras自定义类对象列表。这是我设置检查状态的尝试,但是我无法解决如何设置顺序,因为我需要编辑控件绑定的源列表:< / p>

foreach (KeyValuePair<string, ValuePair> item in presets.JumpCameras)
{
    int index1 = lbCameras.FindStringExact(item.Key);
    if (index1 != -1)
    {
        UnifyCamera camera = lbCameras.Items[index1] as UnifyCamera;
        lbCameras.SetItemCheckState(index1, item.Value.Value1 == true ? CheckState.Checked : CheckState.Unchecked);
    }
}

我的ValuePair类:

public struct ValuePair
{
    public bool Value1;
    public int Value2;

    public ValuePair(bool x, int y)
    {
        Value1 = x;
        Value2 = y;
    }
}

可以访问inputData.Cameras并返回List<UnifyCamera> UnifyCamera.Name,其中var c = document.getElementById('test'), ctx = c.getContext('2d'); ctx.fillStyle = "rgba(0,0,255,0.5)"; ctx.beginPath(); ctx.moveTo(25, 0); ctx.lineTo(50, 50); ctx.lineTo(0, 50); ctx.lineTo(25, 0); ctx.fill(); ctx.fillStyle = "rgba(255,0,0,0.5)"; ctx.beginPath(); ctx.moveTo(50, 0); ctx.lineTo(75, 50); ctx.lineTo(25, 50); ctx.lineTo(50, 0); ctx.fill(); 将匹配/不会在当前控件中不存在来自字典。

1 个答案:

答案 0 :(得分:0)

所以我采用了一点蛮力方法,将任务分成两部分。首先,我重新创建了一个源列表顺序,并重新绑定了我的列表框以进行刷新。然后我为列表中的项目设置所有检查状态。好奇如果有更有效的方法来做到这一点:

// modify source list order
for (int i = 0; i < lbCameras.Items.Count; i++)
{
    UnifyCamera cam = lbCameras.Items[i] as UnifyCamera;
    if (presets.JumpCameras.ContainsKey(cam.Name))
    {
        this.inputData.Cameras.Remove(cam);
        this.inputData.Cameras.Insert(presets.JumpCameras[cam.Name].Index, cam);
    }
}

// re-set the list box bounding to re-set the order.
((ListBox)lbCameras).DataSource = null;
((ListBox)lbCameras).DataSource = this.inputData.Cameras;
((ListBox)lbCameras).DisplayMember = "Name";

// set check boxes
foreach (KeyValuePair<string, ValuePair> item in presets.JumpCameras)
{
    int index1 = lbCameras.FindStringExact(item.Key);
    if (index1 != -1)
    {
        lbCameras.SetItemCheckState(index1, item.Value.Checked == true ? CheckState.Checked : CheckState.Unchecked);
    }
}