kendo

Linq Expression larını birleştirmek

Bu yazıda DataSourceRequest nesnesi ile kendi yazdığımız bir linq expression ı nasıl birleştireceğimizi anlatacağım. Bu işlemi bir .net sınıfı olan ExpressionVisitor sınıfı ile yapacağız. Kullanacağımız custom ExpressionVisitor şu şekilde

class ParameterUpdateVisitor : ExpressionVisitor
    {
        private ParameterExpression _oldParameter;
        private ParameterExpression _newParameter;

        public ParameterUpdateVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
        {
            _oldParameter = oldParameter;
            _newParameter = newParameter;
        }

        protected override Expression VisitParameter(ParameterExpression node)
        {
            if (object.ReferenceEquals(node, _oldParameter))
                return _newParameter;

            return base.VisitParameter(node);
        }
        public static Expression<Func<T, bool>> UpdateParameter<T>(Expression<Func<T, bool>> expr,ParameterExpression newParameter)
        {
            var visitor = new ParameterUpdateVisitor(expr.Parameters[0], newParameter);
            var body = visitor.Visit(expr.Body);

            return Expression.Lambda<Func<T, bool>>(body, newParameter);
        }
    }
public Expression<Func<VType, bool>> KendoFilterExpression(DataSourceRequest req, Expression<Func<VType, bool>> predToJoin = null)
        {
            var str = "";
            if (req != null && req.Filter != null && req.Filter.Filters.Count() > 0)
            {
                str = req.Filter.ToExpressionMy(req.Filter.Filters.ToList(), CaseInSensitive);
                var dataVal = req.Filter.Filters.Select(a => (CaseInSensitive && a.Value.GetType() == "".GetType()) ? a.Value.ToString().ToUpperInvariant() : a.Value).ToArray();
                var kendoExp = System.Linq.Dynamic.DynamicExpression.ParseLambda<VType, bool>(str, dataVal);

                if (predToJoin != null)
                {
                    // linq içindeki parametreyi (a=> deki a) birleştireceğimiz expression ın parametresi ile aynı yapıyoruz
                    kendoExp = ParameterUpdateVisitor.UpdateParameter<VType>(kendoExp, predToJoin.Parameters.Single());
                    var e = Expression.Lambda<Func<VType, bool>>(Expression.And(predToJoin.Body, kendoExp.Body), kendoExp.Parameters);
                    return e;
                }
                else
                    return kendoExp;
            }
            else
            {
                if (predToJoin != null)
                    return predToJoin;
                else
                    return null;
            }
        }

Kendo Grid için varsayılan filtre operatörü özelliği

Kendo Grid için kolon varsayılan filtre operatörü eklentisi

kullanım basitçe şu şekilde:

columns: [{
field: “productName”,
// Buraya varsayılan olarak gelmesini istediğimiz filter operatörünü yazıyoruz
defaultFilter:”contains”
}, {
field: “category”
}
],

Örnek için tıklayınız

function InitColumnListMenu(e) {
  var menuColums = e.container.find("[role='menuitemcheckbox']");
	menuColums.each(function (index, item) {
		var columnChkInput = $(item).find("input");
		var columnName = columnChkInput.data("field");
  	var columnOption = e.sender.options.columns.filter(function (data) {
				return data.field == columnName;
			});
		if (columnOption.length &gt; 0) {
			var removable = columnOption[0].removable == false;
			var isDisabled = columnChkInput.prop("disabled");
			if (removable &amp;&amp; !isDisabled) {
				columnChkInput.attr("type", "radio");
				columnChkInput.parent().click(function (e) {
					var e = e || event;
					e.stopPropagation();
					return false;
				});
			}
		}
	});
}
function InitFilterMenu(e) {
  var drpDowns = $(e.container).find("[data-role='dropdownlist']").not('.k-filter-and');
	var numericInputs = $(e.container).find("[data-role='numerictextbox']");
	var inputs = $(e.container).find('input[type=text]').not(".k-formatted-value");
	if (inputs.length != drpDowns.length)
		return;

	var dfoCol;
	$(e.sender.options.columns).each(function (i, item) {
		if (item.field == e.field)
			dfoCol = item;
	});

	// defaultFilter
	drpDowns.each(function (i, select) {

    //kolon bulundu ise ve defaultFilter özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.defaultFilter &amp;&amp; inputs[i].value == "") 
		{
			var dfo = dfoCol.defaultFilter;
			var dfoOption = $(select).find("option[value='" + dfo + "']");
			if (dfoOption) {
				var dfoIndex = dfoOption.index();
				var d = $(select).getKendoDropDownList();
				d._initial = dfoCol.defaultFilter;
				d.select(dfoIndex);
				d.trigger('change');
			}
		}
	});
	numericInputs.each(function (i, nInput) {
		var editor = $(nInput).getKendoNumericTextBox();
     //kolon bulundu ise ve editorFormat özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.editorFormat)
		{
			editor.setOptions({
				format: dfoCol.editorFormat
			});
		}
    //kolon bulundu ise ve editorDecimals özelligi set edildi ise
		if (dfoCol &amp;&amp; dfoCol.editorDecimals) 
		{
			editor.setOptions({
				decimals: dfoCol.editorDecimals
			});
		}
	});
}
$("#grid").kendoGrid({
	selectable: "multiple cell",
	allowCopy: true,
	filterable: true,
	columns: [{
			field: "productName",
    defaultFilter:"contains"
		}, {
			field: "category"
		}
	],
  columnMenu:true,
 	filterMenuInit: function (e) {
    var that = e;
		e.sender.bind("open", function (e) {
			InitFilterMenu(that);
		});
	},
  columnMenuInit:function(e){
    if (e.sender.options.filterable) {
      var that = e;
			var filterMenu = e.container.find("[data-role='filtermenu']").getKendoFilterMenu();
			if (filterMenu) {
				filterMenu.popup.bind("open", function (e) {
					InitFilterMenu(that);
				});
			}
		}
  },
	dataSource: [{
			productName: "Tea",
			category: "Beverages"
		}, {
			productName: "Coffee",
			category: "Beverages"
		}, {
			productName: "Ham",
			category: "Food"
		}, {
			productName: "Bread",
			category: "Food"
		}
	]
});