Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT单元格表格单元格只读/禁用/不可编辑_Gwt_Celltable - Fatal编程技术网

GWT单元格表格单元格只读/禁用/不可编辑

GWT单元格表格单元格只读/禁用/不可编辑,gwt,celltable,Gwt,Celltable,我想使行中的某些单元格不可编辑。 到目前为止,我的解决方案是在创建列时,如果一个列是只读的,则创建一个TextCell,如果不是,则使用默认的单元格,可以是EditTextCell、DatePickerCell等 问题是我不能使某些行为只读,而另一些行为非只读。或者它们都是只读字段,或者它们不是只读字段 我该怎么做才能做出这个例子呢 表: 数据1 |数据2 |数据3 -------------------------------------- 只读|非只读|只读 只读|只读|非只读 当我的意思是

我想使行中的某些单元格不可编辑。 到目前为止,我的解决方案是在创建列时,如果一个列是只读的,则创建一个TextCell,如果不是,则使用默认的单元格,可以是EditTextCell、DatePickerCell等

问题是我不能使某些行为只读,而另一些行为非只读。或者它们都是只读字段,或者它们不是只读字段

我该怎么做才能做出这个例子呢

表:
数据1 |数据2 |数据3
--------------------------------------
只读|非只读|只读
只读|只读|非只读

当我的意思是“只读”时,可以“启用”或将其设置为“文本单元格”

公共类FabriCel扩展了TextInputCell{
私人字符串坎波;
公共建筑(弦坎波){
这个.campo=campo;
}
@凌驾
public void onBrowserEvent(上下文上下文、元素父级、字符串值、NativeEvent事件、ValueUpdater ValueUpdater){
Boolean editable=false;///从模型中获取它
如果(可编辑!=null&&!可编辑){
event.preventDefault();
}否则{
onBrowserEvent(上下文、父级、值、事件、值更新程序);
}
}
还有这个

@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
    Boolean editable = false;///get it from your model
    if(editable){
        Log.log();
        sb.appendHtmlConstant("<div contentEditable='false'>"  +value+"</div>");        
    }else{
        Log.log("No entra");
        super.render(context, value, sb);
    }

}  
@覆盖
public void render(com.google.gwt.cell.client.cell.Context上下文、字符串值、安全HTMLBuilder sb){
Boolean editable=false;///从模型中获取它
如果(可编辑){
Log.Log();
sb.附加HtmlConstant(“+value+”);
}否则{
Log.Log(“无entra”);
超级渲染(上下文、值、sb);
}
}  

谢谢!

您必须创建一个自定义单元格。在这种情况下,您必须告诉运行时它应该是只读的,或者不应该是只读的。举个例子

        private class CustomCell extends EditTextCell {
            public void render(com.google.gwt.cell.client.Cell.Context context, 
            String value, SafeHtmlBuilder sb) {
            Data data=context.getKey();
            if(data.isReadOnly()){

            sb.appendHtmlConstant("<div contentEditable='false'
             unselectable='false' >"  +value+"</div>");         
                        }else{
                            super.render(context, value, sb);


                        }

                }   
            }
私有类CustomCell扩展了EditTextCell{
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb){
Data=context.getKey();
if(data.isReadOnly()){
sb.附加HtmlConstant(“+value+”);
}否则{
超级渲染(上下文、值、sb);
}
}   
}
在给定的bean中,有一些条件表示readonly或no readonly。 并创建类似列的

Column<Data, String> nameColumn = new Column<Data, String>(new CustomCell()) {

        @Override
        public String getValue(Data object) {
            return object.getName();

        }
    };
Column name Column=new Column(new CustomCell()){
@凌驾
公共字符串getValue(数据对象){
返回object.getName();
}
};

一种方法是覆盖可编辑单元格的onBrowserEvent事件,如果单元格不可编辑,则使用该事件

            final EditTextCell cell = new EditTextCell(renderer)
            {
                @Override
                public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) 
                {
                    Boolean editable = false;///get it from your model

                    if(editable != null && !editable)
                    {
                        event.preventDefault();
                    }
                    else
                    {
                        super.onBrowserEvent(context, parent, value, event, valueUpdater);
                    }
                }
}
final EditTextCell=新的EditTextCell(渲染器)
{
@凌驾
public void onBrowserEvent(上下文上下文、元素父级、字符串值、NativeEvent事件、ValueUpdater ValueUpdater)
{
Boolean editable=false;///从模型中获取它
如果(可编辑!=null&&!可编辑)
{
event.preventDefault();
}
其他的
{
onBrowserEvent(上下文、父级、值、事件、值更新程序);
}
}
}

我也有同样的需求;在EditTextCell上测试了覆盖渲染、iEdit、resetFocus和edit的各种组合(我没有尝试onBrowserEvent解决方案)

当我只覆盖渲染时(如果不可编辑,则显示HTML值);我在重置焦点时出错(如有)。即使我覆盖了resetFocus,这种情况仍会继续。当我仅覆盖IsEdit时,单元格在单击时将闪烁为编辑状态,然后返回。最有效的方法是覆盖edit。我通过向Column传入的值添加标记来触发。getValue,您可以随意触发,但结果非常简单:

private static class LockableEditTextCell extends EditTextCell {
    @Override
    protected void edit(Context context, Element parent, java.lang.String value) {
      if (!value.startsWith(LOCKED_CELL_VALUE)) {
        super.edit(context, parent, value);
      }
    }
  }

我不知道如何在运行时更改单元格。我无法触发onBrowserEvent。我也不使用DOm元素…如果您开始在单元格上键入,事件将进入onBrowserEvent。无论如何,您混合了这两个答案。在我给出答案时,您必须创建自定义单元格。而不是直接放置
EditTextCell,您必须添加自定义单元格。您可以添加一些代码吗?如果我没有错,那么在我发布代码时,您的要求与之匹配。为什么您使用
TextInputCell
,而不是我不理解的
EditTextCell
。您希望何时调用
onBrowserEvent
/
呈现
?在调试模式下运行,并使用debug p检查我终于成功了!在你和我的帮助下,我成功了。
Column<Data, String> nameColumn = new Column<Data, String>(new CustomCell()) {

        @Override
        public String getValue(Data object) {
            return object.getName();

        }
    };
            final EditTextCell cell = new EditTextCell(renderer)
            {
                @Override
                public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) 
                {
                    Boolean editable = false;///get it from your model

                    if(editable != null && !editable)
                    {
                        event.preventDefault();
                    }
                    else
                    {
                        super.onBrowserEvent(context, parent, value, event, valueUpdater);
                    }
                }
}
private static class LockableEditTextCell extends EditTextCell {
    @Override
    protected void edit(Context context, Element parent, java.lang.String value) {
      if (!value.startsWith(LOCKED_CELL_VALUE)) {
        super.edit(context, parent, value);
      }
    }
  }