【问题标题】:ObjectListview checkbox column not change state when click单击时 ObjectListview 复选框列不更改状态
【发布时间】:2016-11-29 12:29:40
【问题描述】:

我正在使用 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 但没有运气。请帮忙!

对不起我的英语。

【问题讨论】:

  • 复选框是否正确反映了 CoHoc 的初始状态?
  • 没有。 CoHoc 的初始值为 false 并且复选框被正方形选中,我无法更改它!
  • 您确定要添加到 ObjectListView 的 HocVienLopDTO 对象实际上在 DSNgayHoc 列表中有项目并且它不是 NULL 或空的吗?您是否将this.lop 添加到OLV?您可能不只添加一个模型对象? “方形”复选框表示 OLV 在访问 AspectName 后面的值时遇到问题。
  • 是的。当我尝试直接在 HocVienLopDTO 中使用 bool 属性时,它工作正常。但是,如果我尝试从 HocVienDTO 的 DSNgayHoc 访问 CoHoc,它就不起作用。也许 OLV 不支持从子集合中获取方面?
  • 啊,是的,现在我明白了。你真的不能像那样设置 AspectName。 OLV 使用反射来搜索具有该名称的属性。这不能这样工作,它不知道您正在访问列表索引。但是有一个解决方法。 AspectName 仅适用于简单的用例。我会将其发布为答案。

标签: c# objectlistview


【解决方案1】:

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;
};
// ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多