如果自定义,DynamicVIewPanel 将忽略 oncolumnclick

DynamicVIewPanel ignores oncolumnclick if customized

使用 DynamicViewPanel 和定制程序 bean 更改 link 的列。作为视图中第一列的列使用 setRendered() 方法通过 bean 隐藏,另一列使用 setDisplayAs("link") 方法设为 link。这工作正常,但 oncolumnclick 事件永远不会触发。该事件似乎与原始列相关联,而不是 "new" link 列。

无论如何要将事件绑定到 "new" link 列?在导航到新的 XPage 之前,我需要设置一个作用域变量。

霍华德

使用 Maire 建议的方法使它起作用。

方法中,publicvoid afterCreateColumn(FacesContext context, int index, ColumnDef colDef, IControl column) {, 我添加了这段代码以从我隐藏的列中获取事件:

//Hide the first column in this view
        if(dynamicColumn.getColumnName().equalsIgnoreCase("")){
          //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;

然后,在我创建我想成为的专栏的地方 link 我添加了:

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");
          }

      }

我没试过,但你可以尝试移动 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:eventHandler 仍会监听对其祖先列 1 的点击。

您可以在 customizerBean 中移动 eventHandler,如下所示:

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(...) ]