`
jxd_zxf
  • 浏览: 230817 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于datagrid可编辑表格使用Combobox多选编辑时无法选择、新增时无法保存BUG解决

阅读更多

在datagrid可编辑表格里面使用Combobox多选,会出现以下问题:

1、双击编辑然后点击下拉箭头会发现所有的选项都会被选中而无法再次进行选择

2、新增一行combobox选择了多个值后,该行结束编辑时,combobox列显示空白值,选择的值根本就没有设置到单元格

下面来找下原因吧。先来分析下datagrid的beginEdit的源码:

function beginEdit(jq, rowIndex) {
		var opts = $.data(jq, "datagrid").options;
		var tr = opts.finder.getTr(jq, rowIndex);
		var row = opts.finder.getRow(jq, rowIndex);
		if (tr.hasClass("datagrid-row-editing")) {
			return;
		}
		if (opts.onBeforeEdit.call(jq, rowIndex, row) == false) {
			return;
		}
		tr.addClass("datagrid-row-editing");
		createEditor(jq, rowIndex);
		fixEditorSize(jq);
		tr.find("div.datagrid-editable").each(function() {
			var field = $(this).parent().attr("field");
			var ed = $.data(this, "datagrid.editor");//获取到Editor
			ed.actions.setValue(ed.target, row[field]);//调用Editor的acions里面的setValue方法赋值
		});
		validateRow(jq, rowIndex);
	};

 注意这两行代码:

 var ed = $.data(this, "datagrid.editor");//获取到Editor
 ed.actions.setValue(ed.target, row[field]);//调用Editor的acions里面的setValue方法赋值

 

row[field]是行对应的combobox列的值,这个值是一个字符串,单个值时为'value1',多个值时则为'value1,value2,..,valueN'

 

然后我们再看下ed.actions.setValue方法:

combobox : {
			init : function(container, options) {
				var editor = $("<input type=\"text\">").appendTo(container);
				editor.combobox(options || {});
				return editor;
			},
			destroy : function(jq) {
				$(jq).combobox("destroy");
			},
			getValue : function(jq) {
				return $(jq).combobox("getValue");
			},
			setValue : function(jq, value) {
				$(jq).combobox("setValue", value);
			},
			resize : function(jq, width) {
				$(jq).combobox("resize", width);
			}
		}

 

可以看到,action的setValue方法只是单选的值设置,而并不是多选的值设置。问题出现了。既然是多选,就应该用setValues方法,而且values应该是值数组才对啊,而不是setValue(value)啊。

解决方法,扩展改写getValue方法如下:

$.extend($.fn.datagrid.defaults.editors.combobox, {
		setValue : function(jq, value) {
			var opts = $(jq).combobox('options');
			if(opts.multiple&&value.indexOf(opts.separator)!=-1){//多选且不只一个值
				var values = value.split(opts.separator);
				$(jq).combobox("setValues", values);
			}
			else
				$(jq).combobox("setValue", value);
		}
	});

 OK,双击编辑不能选择的问题解决了~~

 

下面再来看下新增行combobox多选后保存不了值的问题,同样来看datagrid的endEdit源码:

function stopEdit(jq, rowIndex, revert) {
		var opts = $.data(jq, "datagrid").options;
		var updatedRows = $.data(jq, "datagrid").updatedRows;
		var insertedRows = $.data(jq, "datagrid").insertedRows;
		var tr = opts.finder.getTr(jq, rowIndex);
		var row = opts.finder.getRow(jq, rowIndex);
		if (!tr.hasClass("datagrid-row-editing")) {
			return;
		}
		if (!revert) {
			if (!validateRow(jq, rowIndex)) {
				return;
			}
			var changed = false;
			var newValues = {};
			tr.find("div.datagrid-editable").each(function() {
				var field = $(this).parent().attr("field");
				var ed = $.data(this, "datagrid.editor");
				var value = ed.actions.getValue(ed.target);//通过actions的getValue方法获取到编辑器的值,然后直接赋给单元格
				if (row[field] != value) {
					row[field] = value;
					changed = true;
					newValues[field] = value;//把编辑器的值赋给单元格
				}
			});
			if (changed) {
				if (getObjectIndex(insertedRows, row) == -1) {
					if (getObjectIndex(updatedRows, row) == -1) {
						updatedRows.push(row);
					}
				}
			}
		}
		tr.removeClass("datagrid-row-editing");
		destroyEditor(jq, rowIndex);
		$(jq).datagrid("refreshRow", rowIndex);
		if (!revert) {
			opts.onAfterEdit.call(jq, rowIndex, row, newValues);
		} else {
			opts.onCancelEdit.call(jq, rowIndex, row);
		}
	}

 

注意带注释的两行,combobox选择完然后结束编辑,endEdit是调用编辑器的action的getValue方法获取值,然后直接赋值给单元格的。那么看下combobox这个editor的getValue方法:

combobox : {
			init : function(container, options) {
				var editor = $("<input type=\"text\">").appendTo(container);
				editor.combobox(options || {});
				return editor;
			},
			destroy : function(jq) {
				$(jq).combobox("destroy");
			},
			getValue : function(jq) {
				return $(jq).combobox("getValue");//直接赋值,并没有区分是否多选
			},
			setValue : function(jq, value) {
				$(jq).combobox("setValue", value);
			},
			resize : function(jq, width) {
				$(jq).combobox("resize", width);
			}
		}

 

呵呵,两个问题其实都是同一个原因,都没考虑多选的情况,那么同样问题可以这样解决,在上面扩展的基础上,把getValue的方法也改写下:

$.extend($.fn.datagrid.defaults.editors.combobox, {
	getValue : function(jq) {
		var opts = $(jq).combobox('options');
		if(opts.multiple){
			var values = $(jq).combobox('getValues');
			if(values.length>0){
				if(values[0]==''||values[0]==' '){
					return values.join(',').substring(1);//新增的时候会把空白当成一个值了,去掉
				}
			}
			return values.join(',');
		}
		else
			return $(jq).combobox("getValue");
	},
	setValue : function(jq, value) {
		var opts = $(jq).combobox('options');
		if(opts.multiple&&value.indexOf(opts.separator)!=-1){//多选且不只一个值
			var values = value.split(opts.separator);
			$(jq).combobox("setValues", values);
		}
		else
			$(jq).combobox("setValue", value);
	}
});

 

到此,两个问题都解决了~~

分享到:
评论
1 楼 leon382 2014-03-13  
good job

相关推荐

    jQuery EasyUI编辑DataGrid用combobox实现多级联动

    在jQuery EasyUI中,DataGrid是一种常用的表格展示控件,它可以与各种编辑器结合使用,如combobox(下拉框)来实现更丰富的交互功能。本文主要探讨的是如何利用jQuery EasyUI的DataGrid和combobox组件实现多级联动的...

    EasyUI可扩展Editable DataGrid(可编辑数据表格)

    标题 "EasyUI可扩展Editable DataGrid(可编辑数据表格)" 涉及的是一个流行的JavaScript框架——EasyUI中的一个特性。EasyUI是基于jQuery的一个轻量级且易于使用的前端框架,它提供了一系列预定义的CSS样式和...

    Wpf datagrid 多选、单选、反选

    在Windows Presentation Foundation (WPF) 中,`DataGrid` 是一个强大的控件,常用于显示和操作表格数据。本篇文章将深入探讨如何实现`DataGrid`的多选、单选和反选功能,以提高用户界面的交互性。 首先,我们要...

    Datagrid中使用combobox

    在Windows Presentation Foundation (WPF)开发中,DataGrid控件是一种强大的数据展示工具,它可以用于显示和编辑表格形式的数据。而当需要在某列中提供下拉选择功能时,我们通常会使用ComboBox控件。本篇文章将深入...

    WPF在DataGrid列中使用ComboBox绑定,改变ComboBox可回传至绑定的实体,ComboBox绑定的是一个实体

    WPF在DataGrid列中使用ComboBox绑定,改变ComboBox可回传至绑定的实体, 网上找了好久,终于搞定了,不是那个用枚举的例子!!ComboBox绑定的是一个实体列表. 程序名字叫 给唐僧选老婆!哈哈

    easyui datagrid 行编辑中combogrid和combobox显示问题

    修改上一个资源版本中结束编辑时combobox显示问题. 1、类型为combogrid时每行的参数不同查询返回对应的数据结果。 2、类型为combobox时,输入框显示图标按钮,实现对应的事件。 3、解决类型为combobox显示为value而...

    C#用DataGridView实现多选表格

    在开发这些应用程序时,经常需要展示数据,而DataGridView控件就是一个强大的工具,可以用来显示和编辑表格数据。本教程将详细介绍如何在C#中使用DataGridView实现多选功能,以提供用户友好的交互体验,避免界面因...

    easyui的datagrid中editor和combobox的级联

    2. **Editor**: 在`datagrid`中,`editor`用于编辑表格中的单元格。它可以通过指定的类型来设置单元格的编辑器。 3. **Combobox**: `combobox`是一个下拉列表控件,它结合了输入框和列表的功能,用户可以选择列表中...

    datagrid中combobox的级联

    `datagrid` 的行内编辑功能允许用户直接在表格内对数据进行编辑,而 `combobox` 的级联则是在一个 `combobox` 的选择改变时,动态更新另一个 `combobox` 的选项,以实现联动效果。这种级联通常用于地理信息、部门...

    WPF下DataGrid每行设置不同的ComboBox的数据绑定

    在WPF(Windows Presentation Foundation)开发中,DataGrid控件是一种强大的数据展示工具,它可以用于显示和编辑结构化的数据集合。然而,在某些情况下,我们可能需要在DataGrid的每一行中包含一个ComboBox,并且每...

    WPF在dataGrid中添加CheckBox支持单选,多选,全选功能

    项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选、全选。 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellControlTemplate,Binding, OnPropertyChanged等。

    easyui datagrid editor combogrid和combobox

    easyui datagrid 行编辑时 1、类型为combogrid时每行的参数不同查询返回对应的数据结果。 2、类型为combobox时,输入框显示图标按钮,实现对应的事件。 3、解决类型为combobox显示为value而不是text问题。

    可编辑的datagrid表格控件

    在使用可编辑datagrid时,开发者需要关注以下几点: 1. 数据绑定:datagrid通常需要与数据源进行绑定,如数据库、XML文件或对象集合。编辑操作会直接影响到数据源,因此需要确保数据绑定的正确性和实时性。 2. ...

    wpf DataGrid 实现单击单元格进入编辑状态

    在Windows Presentation Foundation (WPF) 中,DataGrid控件是一个非常强大的数据展示和编辑工具,它允许用户以表格形式查看和操作数据。本教程将详细解释如何实现通过单击单元格来进入编辑状态,特别是在...

    wpf 带有DataGrid控件的ComboBox

    `DataGrid`在WPF中用于展示和编辑表格数据,而`ComboBox`则为`DataGrid`的某一列提供了可选的下拉选项。 这个自定义`ComboBox`控件的独特之处在于它不仅是一个简单的下拉列表,还具备以下特性: 1. **搜索字段**:...

    DataGrid中加入ComboBox的源码

    在.NET框架中,DataGrid控件是用于展示数据表格的常用组件,而ComboBox则是一种下拉选择框,常用于提供用户可选的选项。在某些场景下,我们可能需要在DataGrid的列中嵌入ComboBox,以实现更复杂的交互功能。本节将...

    jquery easy ui edatagrid 动态编辑表格 例子

    在描述中提到的“下拉框联动”是指在表格的一个列中使用下拉框(ComboBox)作为编辑控件,当用户在某一列选择了一个值时,其他相关的列的下拉框选项会自动更新。这种功能常用于关联数据的选取,例如,选择一个国家后...

    DataGrid动态绑定ComboBox

    DataGrid动态绑定ComboBox &lt;DataGridComboBoxColumn.EditingElementStyle&gt;

    easyui datagrid在编辑状态下更新列的值

    在使用EasyUI框架开发Web应用时,Datagrid组件是一个非常重要的元素,它提供了一种方便的方式来展示和操作数据。在标题“easyui datagrid在编辑状态下更新列的值”中,我们关注的是如何在Datagrid的编辑模式下动态地...

Global site tag (gtag.js) - Google Analytics