我在RCP程序中有一个包含set @DatabaseId = (SELECT DatabaseId from tblMarketingCampaigns where Id=@CampaignId);
select @sql += ' AND '+quotename(f.TargetColumn) + f.Operator +
case f.InputType
when 'int' then cast(cf.Value as int)
else quotename(cf.Value,'''')
end
from dbo.transMarketingCampaignFilters as cf
join dbo.tblMarketingCampaignFilters as f
on cf.CampaignFilterId = f.Id
where cf.CampaignId = @CampaignId
set @sql = '
select MarketingUserId,
FirstName,
LastName,
Email,
CompanyId
from dbo.tblMarketingUsers
where DatabaseId = @DatabaseId
'+ @sql+'
OPTION (RECOMPILE)';
if @Debug = 1 print @sql;
set @sql = @Nsql;
exec sys.sp_executesql @Nsql,N'@DatabaseId INT',@DatabaseId;
END
GO
的编辑器。 TableViewer
的内容可以作为编辑器中TableViewer
的结果进行更新。目前,这是通过创建新输入并调用
Action
不幸的是,在编辑器失去焦点或在表格中进行新选择之前,这不会发送tableViewer.setInput(updatedInput);
。这导致SelectionChangedEvent
出现问题,通过Command
-
HandlerUtil.getCurrentSelection(event)
我看到两种解决这个问题的方法。迭代输入并调整现有对象而不是调用ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
...
...//call an action.
...//Inside the action:
Collection<Foo> selectedFoos = HandlerUtil.getCurrentSelection(event).toList();
//No good! We get the unchanged selection back!
可能会起作用,但在我的情况下不是一个选项。相反,我想触发一个setInput()
,它将SelectionChangedEvent
更新其HandlerUtil
变量。目前,我这样做是这样的:
currentSelection
随着选择的改变,这会强制事件被触发。但它也是一个丑陋的黑客,即使有一个评论我认为这可能会混淆将来看这块代码的人。
所以尽管如此,是否有正确的方法让ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
ISelection selection = tableViewer.getSelection();
tableViewer.setSelection(null);
tableViewer.setSelection(selection);
解雇TableViewer
?我可以通过适当的SelectionChangedEvent
自动发生这种情况吗?或者我可以通过从视图或编辑器触发属性更改来以某种方式实现此目的吗?
任何提示都将不胜感激!
答案 0 :(得分:1)
您展示的内容很好,除非您应将选择设置为空而不是null:
tableViewer.setSelection(StructuredSelection.EMPTY);