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