CodeStore.ru

Блог разработчика. Мои шпаргалки :)
  ...
  xtype:'toolbar',
  style: {
    border: 0,
    padding: 2
  },
  ...

Решение нашел тут

var grid = Ext.create('Ext.grid.Panel', {
  scroll: false,
  viewConfig: {
    style: { overflow: 'auto', overflowX: 'hidden' }
  },
  // ...
});
//Текущая директория:
System.getProperty("user.dir")

//Class Path:
System.getProperties().getProperty("java.class.path", null)

//GUID
java.util.UUID.randomUUID().toString()

Решение представляет собой jQuery плагин + css. Плагин применяется к input text или asp:TextBox. Для asp в качестве селектора лучше использовать класс. Плагин «отрывает» input и помещает его в специально подготовленную таблицу. Как я ни пытался обернуть div-ами, ничего хорошего из этого не выходило, работало только под новыми браузерами. roundMe исходные коды
roundMe.css

.roundedText {
  background: url('roundMe.png') no-repeat right -32px;
  border-collapse:collapse;
}
.roundedText .right{
  height:30px;
  width:4px;
}
.roundedText .left {
  background: url('roundMe.png') no-repeat left 0px;
  padding-left:4px;
}
.roundedText input {
  background:transparent;
  border:none;
}

roundMe.js

(function ($) {
  $.fn.roundMe = function () {
    var tpl = '
 
'; this.each(function () { $(this).after(tpl.replace('placeHolder', 'ph_' + $(this).attr('id'))) .detach() .prependTo($('[id="ph_' + $(this).attr('id') + '"]')) .parents('.roundedText'); }); }; })(jQuery);

index.html

...



...


roundMe.png

using System.Web.UI;
using System.Text;
using System.IO;

public class InlineScript : Control
{
  protected override void Render(HtmlTextWriter writer)
  {
    ScriptManager sm = ScriptManager.GetCurrent(Page);
    if (sm.IsInAsyncPostBack)
    {
      StringBuilder sb = new StringBuilder();
      base.Render(new HtmlTextWriter(new StringWriter(sb)));
      string script = sb.ToString();
      ScriptManager.RegisterStartupScript(this, typeof(InlineScript),
        UniqueID, script, false);
    }
    else
      base.Render(writer);
  }
}

Пример использования:

<%@ Register Assembly="MySite" Namespace="MySite" TagPrefix="cc1" %>
...

  

DataTable dt;
...
var q = (from row in dt.AsEnumerable()
         where (int)sr["id"] == 5
         select row).FirstOrDefault();

При группировке записей сортировка групп происходит по названию, а если есть необходимость отсортировать группы по какому-либо другому столбцу, то можно пойти обходным путем. Идея в том, чтобы в текст поля, по которой производится группировка, был добавлен префикс, например, в виде номера, но с заполненными нулями старшими разрядами. Например, есть таблица с сотрудниками, и надо сгруппировать записи по отделу, а сортировку отделов задать по их приоритету:

+---------------+-----------+--------------+
| Подразделение | Приоритет |     ФИО      |
+---------------+-----------+--------------+
|  Управление   |     1     | Иванов И.И.  |
+---------------+-----------+--------------+
|  Управление   |     1     | Петров П.П.  |
+---------------+-----------+--------------+
|  отдел ИТ     |    12     | Сидоров С.С. |
+---------------+-----------+--------------+
|  отдел ИТ     |    12     | Васильев В.В.|
+---------------+-----------+--------------+
|  Финансовый   |    34     | Сергеева А.Б.|
+---------------+-----------+--------------+
|  Финансовый   |    34     | Семенова К.В.|
+---------------+-----------+--------------+

При обычной группировке по полю «Подразделения» отсортируются по алфавиту (отдел ИТ, Управление, Финансовый), а требуется по приоритету. Перед передачей массива гриду модифицируем значения столбца «Подразделения» так:
001~Управление
012~отдел ИТ
034~Финансовый
Заполнение старших разрядов можно сделать с помощью функции ZeroFill, код которой я приводил в одной из предыдущих статей. Записи отсортируются по приоритету, а избавиться от префикса можно в шаблоне заголовка группы:

// фича grid-а для группировки записей с объявлением шаблона отображения
var groupingFeature =
Ext.create('Ext.grid.feature.Grouping',{ groupHeaderTpl: '
{name}
' }); // в гриде объявляем features: [groupingFeature], viewConfig: { stripeRows: true, listeners: { refresh: function(){ $('.ght').each(function(){ $(this).html($(this).html().split('~')[1]); }); } } },

Используем http://spservices.codeplex.com

function getList1(completeFunction){
    result = new Array();
    // updateLoadingMask('Загрузка списка "Отделы"'); // обновление LoadMask
    $().SPServices({ operation: "GetListItems", async: false, listName: "Отделы",
        completefunc: function (xData, Status) {
            $(xData.responseXML).SPFilterNode("z:row").each(function() {
                var row = new Array();
                row[0] = $(this).attr("ows_ID")*1;
                row[1] = $(this).attr("ows_Title");
                result[$(this).attr("ows_ID")*1] = row;
            });
            if(completeFunction) completeFunction(result);
        }
    });
}

//------------------- Последовательная загрузка списков ----------------------
var list1,	// Список 1
    list2,	// Список 2
    list3;	// Список 3

// обертка, чтобы обновлялся индикатор загрузки
function run(fn){ setTimeout(fn,10); }

// Загрузка списков
function GetSPLists(){
    try {
        Ext.loadingMask.show();
        run(function(){ getList1( function(result){
            list1 = result;
            run(function(){ getList2( function(result){
                list2 = result;
                run(function(){ getList3( function(result){
                    list3 = result;
                    // здесь работаем с данными
                });});
            });});
        });});
    } catch(ex) {
        Ext.loadingMask.hide();
    }
}

// если есть необходимость выбрать только нужные столбцы и
// задать caml запрос
caml = '' + start.format('yyyy-mm-dd') + ' T00:00:00Z' + end.format('yyyy-mm-dd') + ' T23:59:00Z';
// в методе SPServices добавляем два параметра
CAMLQuery: caml,
CAMLViewFields: '' +
                '' +
                '' +
                '',
// вычисляет количество дней между двумя датами
function dateDiff(d1,d2){
    var one_day=1000*60*60*24;
    return Math.ceil(d2.getTime()-d1.getTime())/(one_day);
}

// добавление дней к дате
Date.prototype.addDays = function(n) {
    d = new Date();
    d.setFullYear(this.getFullYear(),this.getMonth(),this.getDate());
    d.setDate(d.getDate()+n);
    return d;
};

// возвращает массив из двух дат - начала и конца недели для любой даты start
Date.prototype.getWeek = function(start) {
    start = start || 0;
    var today = new Date(this.setHours(0, 0, 0, 0));
    var day = today.getDay() - start;
    var date = today.getDate() - day;
    var startday = new Date(today.setDate(date+1));
    var endday = startday.addDays(6);
    return [startday, endday];
}

// добавляет часы к дате-времени
Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

Задача: есть два datefield на форме и необходимо, чтобы в первом, где выбирается начальная дата, нельзя было выбрать значение, превышающее дату окончания. И наоборот.
Решение:

    Ext.apply(Ext.form.field.VTypes, {
        daterange: function (val, field) {
            var date = field.parseDate(val);
            if (!date) { return false; }
            if (field.startDateField && (!this.dateRangeMax || (date.getTime() != this.dateRangeMax.getTime()))) {
                var start = field.up('form').down('#' + field.startDateField);
                start.setMaxValue(date);
                start.validate();
                this.dateRangeMax = date;
            }
            else if (field.endDateField && (!this.dateRangeMin || (date.getTime() != this.dateRangeMin.getTime()))) {
                var end = field.up('form').down('#' + field.endDateField);
                end.setMinValue(date);
                end.validate();
                this.dateRangeMin = date;
            }
            return true;
        },
        daterangeText: 'Начальная дата должна быть меньше конечной'
    });

// способ применения (в конфиге формы, например)
items: [{
    xtype: 'datefield',
    startDay: 1,
    fieldLabel: 'Начало периода',
    id: 'startdt',
    vtype: 'daterange',
    endDateField: 'enddt'
}, {
    xtype: 'datefield',
    startDay: 1,
    fieldLabel: 'Окончание периода',
    id: 'enddt',
    vtype: 'daterange',
    startDateField: 'startdt'
}]