单击时,ObjectListview复选框列不会更改状态

时间:2016-11-29 12:29:40

标签: c# objectlistview

我正在使用ObjectListview来显示列的复选框,但是存在问题。

我的模型是这样的:

public class HocVienLopDTO
{
    public HocVienDTO HocVien { get; set; }
    public double Diem { get; set; }
    public List<NgayHocDTO> DSNgayHoc { get; set; }
}

public class NgayHocDTO
{
    public DateTime Ngay { get; set; }
    public bool CoHoc { get; set; }
}

我想创建一个像这样的列表视图:(Diem, DSNgayHoc[0], DSNgayHoc[1], ...)。我想使用所有DSNgayHoc列的复选框来显示它的CoHoc属性的值。所以我动态生成这样的列:

this.lstvDiemDanh.UseSubItemCheckBoxes = true;
    List<OLVColumn> colList = new List<OLVColumn>();
    for (int i = 0; i < this.lop.DSNgayHoc.Count; i++)
    {
        OLVColumn col = new OLVColumn();
        col.IsHeaderVertical = true;
        col.CheckBoxes = true;
        col.AspectName = string.Format(string.Format("DSNgayHoc[{0}].CoHoc", i));
        col.Text = this.lop.DSNgayHoc[i];
        col.Width = 20;
        col.IsEditable = true;
        colList.Add(col);
    }

    this.lstvDiemDanh.AllColumns.AddRange(colList);
    this.lstvDiemDanh.RebuildColumns();

所有复选框都显示正常,但单击它们时状态不会改变。 (总是方盒子)。我试图处理ChangingSubItem事件来改变currentValue和newValue但没有运气。请帮忙!

对不起我的英语。

1 个答案:

答案 0 :(得分:0)

OLV正在使用反射搜索具有AspectName名称的属性。在这种情况下,这不会起作用,因为它不知道您正在访问列表索引。

而不是使用AspectName

// ...
col.AspectName = string.Format(string.Format("DSNgayHoc[{0}].CoHoc", i));
// ...

您必须使用AspectGetterAspectPutter回调来根据需要访问DSNgayHoc列表。

// ...
int listIndex = i;
col.AspectGetter  = delegate(object rowObject) {
    HocVienLopDTO model = rowObject as HocVienLopDTO;

    if (model.DSNgayHoc.Count > listIndex)
        return model.DSNgayHoc[listIndex].CoHoc;
    else
        return false;
};

col.AspectPutter = delegate(object rowObject, object value) {                    
    HocVienLopDTO model = rowObject as HocVienLopDTO;

    if (model.DSNgayHoc.Count > listIndex)
       model.DSNgayHoc[listIndex].CoHoc = (bool)value;
};
// ...
相关问题