JFace TableViewer - 如何在调用setInput(...)后正确fireSelectionChanged()?

时间:2015-07-24 14:38:18

标签: java eclipse-rcp jface tableviewer

我在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自动发生这种情况吗?或者我可以通过从视图或编辑器触发属性更改来以某种方式实现此目的吗?

任何提示都将不胜感激!

1 个答案:

答案 0 :(得分:1)

您展示的内容很好,除非您应将选择设置为空而不是null:

tableViewer.setSelection(StructuredSelection.EMPTY);