单击时 ObjectListview 复选框列不会更改状态
ObjectListview checkbox column not change state when click
我正在使用 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 但没有运气。请帮忙!
对不起我的英语。
OLV 正在使用反射搜索名称为 AspectName
的 属性。这在这种情况下不起作用,因为它不知道您正在访问列表索引。
而不是使用 AspectName
// ...
col.AspectName = string.Format(string.Format("DSNgayHoc[{0}].CoHoc", i));
// ...
您必须根据需要使用 AspectGetter
和 AspectPutter
回调来访问 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;
};
// ...
我正在使用 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 但没有运气。请帮忙!
对不起我的英语。
OLV 正在使用反射搜索名称为 AspectName
的 属性。这在这种情况下不起作用,因为它不知道您正在访问列表索引。
而不是使用 AspectName
// ...
col.AspectName = string.Format(string.Format("DSNgayHoc[{0}].CoHoc", i));
// ...
您必须根据需要使用 AspectGetter
和 AspectPutter
回调来访问 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;
};
// ...