grid 常用自定义调整

[删除/增加]按钮

/**
* This method is called to get list of buttons to be created.
*/
protected getButtons(): Serenity.ToolButton[] {

    // call base method to get list of buttons
    // by default, base entity grid adds a few buttons, 
    // add, refresh, column selection in order.
    var buttons = super.getButtons();

    // here is several methods to remove add button
    // only one is enabled, others are commented

    // METHOD 1
    // we would be able to simply return an empty button list,
    // but this would also remove all other buttons
    // return [];

    // METHOD 2
    // remove by splicing (something like delete by index)
    // here we hard code add button index (not nice!)
    // buttons.splice(0, 1);

    // METHOD 3 - recommended
    // remove by splicing, but this time find button index
    // by its css class. it is the best and safer method
    buttons.splice(Q.indexOf(buttons, x => x.cssClass == "add-button"), 1);

    buttons.push(PuTaoTecCom.Admin.Common.ExcelExportHelper.createToolButton({
        grid: this,
        onViewSubmit: () => this.onViewSubmit(),
        service: 'TaskAdmin/MachineActiveException/ListExcel',
        separator: true,
    }));

    return buttons;
}

设置列表请求地址

protected getViewOptions(): Slick.RemoteViewOptions {
    let opt = super.getViewOptions();
    opt.url = Q.resolveUrl("~/Services/" + this.getService() + "/List"); 
    opt.rowsPerPage = 1;
    return opt;
}

启用分页

protected usePager() {
    return false;
}

列设置

protected getColumns(): Slick.Column[] {
    let fld = MachineActiveExceptionRow.Fields;
    return super.getColumns().filter(x => x.field !== fld.ErrorCount);
}

Excel导出

public FileContentResult ListExcel(IDbConnection connection, ListRequest request)
{
    var data = List(connection, request).Entities;
    var report = new DynamicDataReport(data, request.IncludeColumns, typeof(Columns.CustomStatusStatDetailColumns));
    var bytes = new ReportRepository().Render(report);
    return ExcelContentResult.Create(bytes, "StatDetailList_" +
        DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx");
}

去除id列表

protected getIdProperty() { return "__id"; }

private nextId = 1; 
protected onViewProcessData(response: Serenity.ListResponse<TaskAdmin.CustomStatusStatDetailRow>) {
    response = super.onViewProcessData(response);
    for (var x of response.Entities) {
        (x as any).__id = this.nextId++;
    }
    return response;
}

自定义搜索控件/设置初始值

protected createQuickFilters(): void {

    //super.createQuickFilters();
    let fld = xxxRow.Fields;

    let d = new Date();
    if (d.getDate() > 2) {
        d.setDate(d.getDate() - 2);
    }
    else {
        d.setDate(-2);
    }
    //this.findQuickFilter(Serenity.StringEditor, fld.Time).value = Q.formatDate(d, "yyyyMMdd");

    this.addQuickFilter({
        type: Serenity.DateEditor,
        field: "Time"
    });
    this.findQuickFilter(Serenity.DateEditor, "Time").valueAsDate = d;
}

设置自定义检索条件

protected onViewSubmit() {
    // only continue if base class returns true (didn't cancel request)
    if (!super.onViewSubmit()) {
        return false;
    }

    // view object is the data source for grid (SlickRemoteView)
    // this is an EntityGrid so its Params object is a ListRequest
    var request = this.view.params as Serenity.ListRequest;

    // list request has a Criteria parameter
    // we AND criteria here to existing one because 
    // otherwise we might clear filter set by 
    // an edit filter dialog if any.

    request.Criteria = Serenity.Criteria.and(request.Criteria,
        [['UnitsInStock'], '>', 10],
        [['CategoryName'], '!=', 'Condiments'],
        [['Discontinued'], '=', 0]);

    // TypeScript doesn't support operator overloading
    // so we had to use array syntax above to build criteria.

    // Make sure you write
    // [['Field'], '>', 10] (which means field A is greater than 10)
    // not 
    // ['A', '>', 10] (which means string 'A' is greater than 10

    return true;
}

列自定义格式输出

//InlineImageFormatter.ts

namespace Serene1.BasicSamples {

    @Serenity.Decorators.registerFormatter()
    export class InlineImageFormatter
        implements Slick.Formatter, Serenity.IInitializeColumn {

        format(ctx: Slick.FormatterContext): string {

            var file = (this.fileProperty ? ctx.item[this.fileProperty] : ctx.value) as string;
            if (!file || !file.length)
                return "";

            let href = Q.resolveUrl("~/upload/" + file);

            if (this.thumb) {
                var parts = file.split('.');
                file = parts.slice(0, parts.length - 1).join('.') + '_t.jpg';
            }

            let src = Q.resolveUrl('~/upload/' + file);

            return `<a class="inline-image" target='_blank' href="${href}">` +
                `<img src="${src}" style='max-height: 145px; max-width: 100%;' /></a>`;
        }

        initializeColumn(column: Slick.Column): void {
            if (this.fileProperty) {
                column.referencedFields = column.referencedFields || [];
                column.referencedFields.push(this.fileProperty);
            }
        }

        @Serenity.Decorators.option()
        public fileProperty: string;

        @Serenity.Decorators.option()
        public thumb: boolean;
    }
}

//在设置属性前,要先t4编译下才能有智能提示

[InlineImageFormatter(FileProperty = "ProductImage", Thumb = true), Width(450)]
public String ProductThumbnail { get; set; }
email:[email protected] all right reserved,powered by GitbookFile Modify: 2018-12-03 03:21:50

results matching ""

    No results matching ""