我已将 UltraGrid 放在 WinForms 用户控件上。我调整了一些设置,以便可以将网格用作只读多行选择表。但有一个问题:默认情况下,第一行似乎被选中。
但是
Selected.Rows
属性为空,并且 ActiveRow
属性为 null
。
因此该行似乎已被选中,但实际上并未被选中,因此无法删除选择。
我确信 UltraGrid 上一定隐藏着一个设置来控制此行为。 如果情况并非如此,那么也许有解决方法?
谢谢。
经过更多研究,我找到了解决方案,我将与大家分享:
myUltraGrid.DisplayLayout.Override.ActiveCellAppearance.Reset();
myUltraGrid.DisplayLayout.Override.ActiveRowAppearance.Reset();
试试这个:
this.ultraGrid1.SyncWithCurrencyManager = false;
this.ultraGrid1.DisplayLayout.Override.RowSelectors=DefaultableBoolean.False;
这帮助我抑制了网格的“活跃外观”:
grid.DisplayLayout.Override.ActiveAppearancesEnabled = Infragistics.Win.DefaultableBoolean.False;
如果您也不希望将某行标记为选定,则必须对“选定的外观”执行相同的操作:
grid.DisplayLayout.Override.SelectedAppearancesEnabled = Infragistics.Win.DefaultableBoolean.False;
我遇到了与您完全相同的问题,但 Gerrie Schenck 的解决方案对我不起作用。 我用了这个技巧: MyUltraGrid.ActiveRow = MyUltraGrid.Rows[0]; MyUltraGrid.ActiveRow = null;
区分 Selected 和 Active 很重要。网格永远不会自动选择任何行。您所看到的是 ActiveRow,它会像所选行一样突出显示。
网格的 ActiveRow 与CurrencyManager 同步,因此默认情况下网格的第一行会突出显示。重置 ActiveRowAppearance 和 ActiveCellAppearance 将从 ActiveRow 中删除默认突出显示。
this.ultraGrid1.DisplayLayout.Override.ActiveCellAppearance.Reset();
this.ultraGrid1.DisplayLayout.Override.ActiveRowAppearance.Reset();
但需要注意的是,这并不能阻止该行成为活动行,只是网格不再突出显示活动行。由于该行仍然处于活动状态(并且无法阻止这种情况),任何突出显示活动行的其他内容仍然会突出显示该行。例如,如果您将样式库 (*.isl) 文件加载到将样式应用于 ActiveRow 的应用程序中,它仍然会显示。
如果你想更彻底地禁用活动行外观,完全忽略所有属性设置和样式库设置,你可以这样做:
this.ultraGrid1.DisplayLayout.Override.ActiveAppearancesEnabled = Infragistics.Win.DefaultableBoolean.False;
注意,该属性是在 v9.2 中添加的,旧版本中不存在。
不知何故,上面列出的解决方案都不适合我。 就我而言,我只是希望根本不发生激活/选择。 所以我做了以下事情。 这可能不是最好的解决方案,但它确实有效。
private void LayoutVisulizerUltraGrid_AfterRowActivate(object sender, EventArgs e)
{
LayoutVisulizerUltraGrid.ActiveRow = null;
}
完全禁用所选行,然后将
ActiveRow
设置为 null 应清除选择。
grid.DisplayLayout.Override.SelectTypeRow = Infragistics.Win.UltraWinGrid.SelectType.None;
如果您只想清除默认的ActiveRow,但想以正常方式突出显示以下所有活动行:
设置布尔标志
private bool firstActiveRowDeactivated = false;
然后就可以在AfterRowActivate事件中处理了
private void grdSuspectedCounterfeit_AfterRowActivate(object sender, EventArgs e)
{
if(!firstActiveRowDeactivated && grdSuspectedCounterfeit.ActiveRow != null)
{
grdSuspectedCounterfeit.ActiveRow = null;
firstActiveRowDeactivated = true;
}
}
这不是正确的方法,但它确实有效。 影响应该不是最大的,因为一次只能有一个 ActiveRow。
使用此解决方案,该行不会像此处的情况那样被虚线包围。
grdSuspectedCounterfeit.DisplayLayout.Override.ActiveCellAppearance.Reset();
grdSuspectedCounterfeit.DisplayLayout.Override.ActiveRowAppearance.Reset();