我正在使用DevExpress Gridview控件。
我有两个不同的问题:
我有四行数据(数据集中总是前4条记录),始终不能编辑某些单元格。这些行应该具有灰色背景的某些列,表明它们已被禁用。
现在,我唯一可以使用的是GridView2_RowCellStyle
:
Dim View As GridView = sender
If e.Column.FieldName = "Percent" Or e.Column.FieldName = "PGPct" Or e.Column.FieldName = "VGPct" Then
If e.RowHandle = 0 Or e.RowHandle = 1 Or e.RowHandle = 2 Or e.RowHandle = 3 Then
e.Appearance.BackColor = Color.Silver
End If
End If
和
GridView2_ShowingEditor
:
If GridView2.FocusedColumn.FieldName.ToString = "Percent" Or GridView2.FocusedColumn.FieldName.ToString = "PGPct" Or GridView2.FocusedColumn.FieldName.ToString = "VGPct" Then
If GridView2.FocusedRowHandle = 0 Then
e.Cancel = True
End If
End If
但是,当用户对数据进行排序或分组时,这些行可能会发生变化,这使得无法通过FocusedRowHandle或RowHandle选择它们。
如何确保这些单元格始终处于禁用状态并且背景为灰色,即使在排序或分组时也是如此?
答案 0 :(得分:0)
我认为您可以采取一些措施来实现这一目标。
RowCellStyle
,它是一种无代码的方式来完成同样的事情CurrentChanged
事件有选择地为某些行只读这些列。实际上,您将根据选择的行切换列的只读属性,这将阻止编辑某些行我相信如果你不清楚它们中的任何一个,我相信你可以告诉我。我是一名C#家伙,但我非常确定C#上的模拟示例足够清晰,可以翻译成VB.net。
- 编辑12/15/15 -
在第1项上,假设您的绑定对象是域对象/ POCO /无论如何添加一个属性:
private int _RowNum;
public int RowNum
{
get { return _RowNum; }
}
只需确保在收集数据时分配值或让构造函数执行此操作:
private static _Serial = 1;
public MyDomainObject()
{
_RowNum = _Serial++;
}
或 - 如果你想在事后做到这一点:
int serial = 1;
MyDomainObjectList.Foreach(x => x.RowNum = serial++);
对于第4项,我想象你有一个绑定源,如果你在绑定源上触发CurrentChanged
事件:
bindingSource1.CurrentChanged += new System.EventHandler(bindingSource1_CurrentChanged);
它看起来像这样:
private void bindingSource1_CurrentChanged(object sender, EventArgs e)
{
MyDomainObject curr = (MyDomainObject)bindingSource1.Current;
bool locked = curr.RowNum >= 1 && curr.RowNum <= 4;
colPercent.OptionsColumn.ReadOnly =
colPGPct.OptionsColumn.ReadOnly = locked;
}
这与格式化没有任何关系(由我的建议#3处理),但它会根据选择的行选择性地锁定或解锁列。由于用户无法编辑他不在的行,因此可以实现使某些行无法编辑的目标。
我为C#道歉。我知道你问了一个VB问题,但我觉得你读C#比我猜测VB语法更容易。
看看这是否有任何意义,或者我是否可以进一步澄清。这有点难以推测,所以我理解它是否是一个失败的原因。
答案 1 :(得分:0)
您可以使用GridView.GetDataSourceRowIndex
方法获取基础数据源的实际索引。此索引不依赖于GridView
中的排序,分组,过滤等,并且始终为同一行返回相同的值。
例如:
Private Sub gridView2_RowCellStyle(ByVal sender As Object, ByVal e As RowCellStyleEventArgs) Handles gridView2.RowCellStyle
Dim View As GridView = sender
If e.Column.FieldName = "Percent" Or e.Column.FieldName = "PGPct" Or e.Column.FieldName = "VGPct" Then
If View.GetDataSourceRowIndex(e.RowHandle) < 4 Then
Dim colors = CommonSkins.GetSkin(UserLookAndFeel.Default).Colors
Dim textColor = colors.GetColor(CommonColors.DisabledText)
Dim backColor = colors.GetColor(CommonColors.DisabledControl)
e.Appearance.ForeColor = textColor
e.Appearance.BackColor = backColor
End If
End If
End Sub