Jump to content

TUniDBGrid Объединение ячеек в строке


Dinkin

Recommended Posts

  • 3 weeks later...

Спасибо!

А можно для уточнения подвести в итоге алгоритм, правильно ли я все понял (просто с последней Вашей корректировкой может какие то пункты можно пропустить)....вот так верно?

1. UniDBGrid1.OnDrawColumnCell ->

 

procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,
  ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
begin
  //if ARow = 1 then
  if Column.Field.DataSet.FieldByName('EmpNo').Value < 30 then
  begin
    if ACol > 1 then
      Attribs.Style.Cls := 'hide-column'
  end;

end;

2.UniDBGrid1.ClientEvents.ExtEvents

function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts)
{
    var startCol = 1; //zero based
    var colCount = columns.length;
    var fieldIndx = 0; //будет рассматриваться первая колонка
    var fieldValue = 30; //значение для условия проверки
    
    columns[startCol].renderer = function (value, metaData, record) {
        if (record.data[fieldIndx] < fieldValue) {
            metaData.tdCls = 'span-columns';
            metaData.tdAttr = 'colspan='+ columns.length-2 ;
        }
        return value;
    };
    
    startCol += 1;
    for (let i = startCol; i < colCount; i++) {
      if (columns[i].widget) {
          columns[i].onWidgetAttach = function(column, widget, record) {
              if (record.data[fieldIndx] < fieldValue) {
                  widget.element.up('td').addCls('hide-column')
              }
          }
      } else {
          columns[i].renderer = function (value, metaData, record) {
              if (record.data[fieldIndx] < fieldValue) {
                  metaData.tdCls = 'hide-column';
              }
              return value;
          }
      }
    }
}

3.UniDBGrid1.LayoutConfig.Cls = adjust-columns

4.CustomCSS ->

.adjust-columns .span-columns {
    width: auto !important;
}

.adjust-columns .x-grid-item {
    /* This is pretty key... the framework sets a width of 0 on the table rows,
     * so this could have some other side effects */
    width: 100% !important;
}

.adjust-columns .hide-column {
    display: none;
}

 

Link to comment
Share on other sites

4 minutes ago, Dinkin said:

1. UniDBGrid1.OnDrawColumnCell ->

 

procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,
  ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
begin
  //if ARow = 1 then
  if Column.Field.DataSet.FieldByName('EmpNo').Value < 30 then
  begin
    if ACol > 1 then
      Attribs.Style.Cls := 'hide-column'
  end;

end;

Добрый день,

Этот код можно удалить, мы перенесли всю логику на клиентскую часть...

Link to comment
Share on other sites

5 minutes ago, Sherzod said:

А какие именно хотите объединить к примеру?

Ну у меня логика, что скрыть абсолютно все что с права от первой колонки.....и вот с 4-по 7(включительно) ку меня колонки в группе.

Link to comment
Share on other sites

1. Удалите код из ClientEvents (reconfigure).

2. Переместите код в OnCreate формы, используя именно JSAddListener:

procedure TMainForm.UniFormCreate(Sender: TObject);
begin
  UniDBGrid1.JSInterface.JSAddListener('reconfigure', 'function(sender, store, columns, oldStore, oldColumns, eOpts){'+
    'var columns = sender.columnManager.getColumns();'+
    'var startCol = 1; '+
    'var colCount = columns.length; '+
    'var fieldIndx = 0; '+
    'var fieldValue = 1500; '+

    'columns[startCol].renderer = function (value, metaData, record) {    '+
    '    if (record.data[fieldIndx] < fieldValue) {                       '+
    '        metaData.tdCls = "span-columns";                             '+
    '        metaData.tdAttr = "colspan="+ columns.length-startCol-1 ;    '+
    '    }                                                                '+
    '    return value;                                                    '+
    '};                                                                   '+

    'startCol += 1;                                                       '+
    'for (let i = startCol; i < colCount; i++) {                          '+
    '  if (columns[i].widget) {                                           '+
    '      columns[i].onWidgetAttach = function(column, widget, record) { '+
    '          if (record.data[fieldIndx] < fieldValue) {                 '+
    '              widget.element.up("td").addCls("hide-column")          '+
    '          }                                                          '+
    '     }                                                               '+
    '  } else {                                                           '+
    '      columns[i].renderer = function (value, metaData, record) {     '+
    '          if (record.data[fieldIndx] < fieldValue) {                 '+
    '              metaData.tdCls = "hide-column";                        '+
    '          }                                                          '+
    '          return value;                                              '+
    '      }                                                              '+
    '  }                                                                  '+
    '}                                                                    '+
   '}');
end;

3. Удалите все "комментарии" в коде (парсер иногда неправильно понимает //).

4. При необходимости, корректируйте переменные в коде (startCol, fieldIndx, fieldValue). 

5. CustomCSS, cls конфиг остаются как прежде...

6. И попробуйте...

  • Like 1
Link to comment
Share on other sites

Добрый день.

Я извиняюсь, небольшой вопросик,  вот то что код выше отменяет для обработаных столбцов событие DrawColumnCell отключается.

Link to comment
Share on other sites

Добрый день!  

А возможно  из JSAddListener вызывать обычную функцию (передав в нее record.data[fieldIndx]) из тела программы, которая будет возвращать к примеру 0 или 1?

Link to comment
Share on other sites

Что то вроде такого (не пишу на паскале...для примера написал)
function TestFunction(st: String):Integer; 

begin
    return_value Integer;
    if  st = 'a'    
        then return_value := 1;
            else 
                return_value := 2;
end;

Или как то то позволить менять цвет строк через GridDrawColumnCell (вижу что переназначили, но все же вдруг есть вариант).

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...