DynamicVIewPanel如果自定义则忽略oncolumnclick

问题描述:

使用DynamicViewPanel和定制程序bean更改作为链接的列。使用setRendered()方法通过bean隐藏视图中第一列的列,并使用setDisplayAs(“link”)方法将另一列作为链接​​。这工作正常,但oncolumnclick事件永远不会触发。看起来,该事件与原始列绑定,而不是“新”链接列。DynamicVIewPanel如果自定义则忽略oncolumnclick

无论如何将一个事件绑定到“新”链接列?在导航到新的XPage之前,我需要设置一个范围变量。

霍华德

得到这个工作使用像梅尔建议。

在该方法中,公共无效afterCreateColumn(FacesContext的上下文中,INT索引, ColumnDef colDef,ICONTROL柱){,我添加这个代码从柱中的事件我躲在:

//Hide the first column in this view 
     if(dynamicColumn.getColumnName().equalsIgnoreCase("$2")){ 
      //dynamicColumn.setRendered(false); 
      dynamicColumn.setDisplayAs("hidden"); 
      String type = dynamicColumn.getChildren().get(0).getClass().toString(); 
      DebugToolbarBean.get().info("type is " + type); 
      event = (XspEventHandler) dynamicColumn.getChildren().get(0); 
     } 

我还创建了一个事件变量来保存这个:

com.ibm.xsp.component.xp.XspEventHandler event; 

然后,在我所做的专栏中,我想成为一个链接我说:

if (dynamicColumn.getColumnName().equalsIgnoreCase("OrderDate")){ 
      //make it a link 
      dynamicColumn.setDisplayAs("link"); 

      DebugToolbarBean.get().info("make OrderDate a link"); 
      if (event != null){ 
       dynamicColumn.getChildren().add(event); 
       DebugToolbarBean.get().info("adding event"); 
      } else { 
       DebugToolbarBean.get().info("event is null"); 
      } 

     } 
+1

如果XPages在您的行为怪异,那么也许您可以编写客户端onclick事件,调用JSON-RPC。然后JSON-RPC可以在后端设置scoped变量。 –

+0

这是一种可能性,因为我可以将CSJS添加到定制程序bean的列中,但是问题是使用CSJS获取该行的值。这部分可能会很棘手...... – Howard

+1

棘手但可能。您可以通过jQuery捕获值并将其传递给JSON-RPC。 –

我还没有试过这个,但是你可以尝试在控制树中移动xp:eventHandler的位置。

如,最初的动态生成控件树是这样的:

xp:viewColumn id="column1" displayAs="link" 
    xp:eventHandler event="onclick" 
xp:viewColumn id="column2" displayAs="text" 

而且你的代码改变它切换displayAs值:

xp:viewColumn id="column1" displayAs="text" 
    xp:eventHandler event="onclick" 
xp:viewColumn id="column2" displayAs="link" 

但XP:事件处理是否仍愿意听用于点击其祖先列1。

你可以在customizerBean移动事件处理程序,就像这样:

public void afterCreateColumns(FacesContext context, UIDynamicViewPanel panel) { 
    UIViewColumn col1 = (UIViewColumn) panel.getChildren().get(0); 
    UIViewColumn col2 = (UIViewColumn) panel.getChildren().get(1); 
    UIEventHandler eventHandler = (UIEventHandler) col1.getChildren().get(0); 
    // move the eventHandler to col2. 
    col2.getChildren().add(eventHandler); 
} 

[创建控件树结构EXTLIB的代码是: com.ibm.xsp.extlib.component.dynamicview.DominoDynamicColumnBuilder .createColumn(...)]

+0

Maire,谢谢,不知道UIViewColumn和UIEventHandler要导入哪些类?我得到 异常 com.ibm.xsp.component.xp.XspEventHandler与com.ibm.xsp.component.UIViewColumn 不相容 我的进口量为: 进口com.ibm.xsp.component.UIEventHandler; import com.ibm.xsp.component。UIViewColumn; 在自定义程序bean中,我已经有了一个名为public void afterCreateColumn(FacesContext上下文,int index, \t ColumnDef colDef,IControl列)的方法签名,我用它来隐藏列并将另一列设置为链接。我会同时使用afterCreateColumn吗? – Howard

+0

Maire,谢谢,找到了com.ibm.xsp.component.xp.XspEventHandler类,并使用它和你的代码。在我的问题编辑中查看我的工作代码。霍华德 – Howard