1

我搜索了许多论坛和帖子,但仍然无法获得 edittype: select with the editoptions: dataurl to work。

填充网格后,数据加载就很好了。当我单击编辑按钮时,下拉列表具有正确的值和名称。当我单击保存时,我收到一条错误消息,指出缺少其中一个参数。它似乎没有拉取所选选项的值。

我已经尝试了 formatter: 'select' 选项,但是当我使用该选项时,加载网格时这些列中没有显示任何内容。

这是我的代码。

var buildSelectFromJson = function (data) {
    var html = '<select>', d = data.d, length = d.length, i = 0, item;
    for (; i < length; i++) {
        item = d[i];
        html += '<option value=' + item.id + '>' + item.value + '</option>';
    }
    html += '</select>';
    return html;
};

$.extend($.jgrid.edit, {
    ajaxEditOptions: { contentType: "application/json" },
    recreateForm: true,
    serializeEditData: function (postData) {
        return JSON.stringify(postData);
    }
});

jQuery("#usage").jqGrid({
    url: '/vochaptracker/Services/vochapService.asmx/GetUsage',
    datatype: 'json',
    mtype: 'post',
    loadonce: true,
    ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
    serializeGridData: function (postData) {
        return JSON.stringify(postData);
    },
    jsonReader: {
        root: function (obj) { return obj.d.rows; },
        page: function (obj) { return obj.d.page; },
        total: function (obj) { return obj.d.total; },
        records: function (obj) { return obj.d.records; }
    },
    colNames: ['Date', 'Paint', 'Booth', 'Gallons Used'],
    colModel: [
        { name: 'date', index: 'date', width: 75, editable: true },
        { name: 'paint', index: 'paint', width: 300, editable: true, edittype: 'select', formatter:'select', editoptions: { dataUrl: "/vochaptracker/Services/vochapService.asmx/GetPaintsForEdit",
            buildSelect: buildSelectFromJson}
        },
        { name: 'booth', index: 'booth', width: 100, editable: true, edittype: 'select', formatter:'select', editoptions: { dataUrl: "/vochaptracker/Services/vochapService.asmx/GetBoothsForEdit",
            buildSelect: buildSelectFromJson}},
        { name: 'gallonsUsed', index: 'gallonsUsed', width: 100, editable: true }
    ],
    rowNum: 20,
    rowList: [20, 30, 40],
    pager: '#pager4',
    sortname: 'ID',
    viewrecords: true,
    sortorder: "desc",
    caption: "Daily Usage",
    height: '400',
    editurl: '/vochaptracker/Services/vochapService.asmx/EditUsage',
    ajaxSelectOptions: { contentType: "application/json", dataType: 'json', type:  "POST" }
});
jQuery("#usage").jqGrid('navGrid', "#pager4", { edit: false, add: false, del: true });
jQuery("#usage").jqGrid('inlineNav', "#pager4");

网络服务:

public class jqGridPaintHelper
{
    public string total;
    public string page;
    public string records;
    public List<TableRow> rows;
}

public class TableRow
{
    public string id;
    public List<string> cell;
}

public class editHelper
{
    public string id;
    public string value;
}

    [WebMethod]
    [ScriptMethod( ResponseFormat = ResponseFormat.Json )]
    public jqGridPaintHelper GetUsage( int page, int rows, string sidx, string sord )
    {
        vochapdbDataContext db = new vochapdbDataContext();
        jqGridPaintHelper helper = new jqGridPaintHelper();
        int dbCount = db.DailyUsages.Count();
        helper.total = ( ( dbCount + rows - 1 ) / rows ).ToString();
        helper.page = page.ToString();
        helper.records = dbCount.ToString();

        List<TableRow> usage = new List<TableRow>( dbCount );
        foreach ( DailyUsage row in db.DailyUsages )
        {
            usage.Add( new TableRow()
            {
                id = row.ID.ToString(),
                cell = new List<string> {
                    row.date.ToShortDateString(),
                    row.Paint.paintName.ToString(),
                    row.Booth.tag.ToString(),
                    row.gallonsUsed.ToString()
                }
            } );
        }

        helper.rows = usage;

        return helper;
    }

    [WebMethod]
    [ScriptMethod( ResponseFormat = ResponseFormat.Json )]
    public int EditUsage( string ID, string date, string paintID, string boothID, string gallonsUsed, string oper, string id )
    {
        vochapdbDataContext db = new vochapdbDataContext();

        if ( oper == "edit" )
        {
            db.updateUsage( int.Parse( ID ), DateTime.Parse( date ), paintID, int.Parse( boothID ), decimal.Parse( gallonsUsed ) );
        }
        else if ( oper == "add" )
        {
            DailyUsage newUsage = new DailyUsage();
            newUsage.date = DateTime.Parse( date );
            newUsage.paintID = paintID;
            newUsage.boothID = int.Parse( paintID );
            newUsage.gallonsUsed = decimal.Parse( gallonsUsed );

            db.DailyUsages.InsertOnSubmit( newUsage );
            db.SubmitChanges();
        }
        else if ( oper == "del" )
        {
            db.deleteUsage( int.Parse( id ) );
        }

        return 1;
    }

    [WebMethod]
    [ScriptMethod( ResponseFormat = ResponseFormat.Json )]
    public List<editHelper> GetPaintsForEdit()
    {
        vochapdbDataContext db = new vochapdbDataContext();

        List<editHelper> paints = new List<editHelper>();

        foreach ( Paint row in db.Paints )
        {
            paints.Add( new editHelper() { id = row.ID, value = row.paintName } );
        }

        return paints;
    }

    [WebMethod]
    [ScriptMethod( ResponseFormat = ResponseFormat.Json )]
    public List<editHelper> GetBoothsForEdit()
    {
        vochapdbDataContext db = new vochapdbDataContext();

        List<editHelper> booths = new List<editHelper>();

        foreach ( Booth row in db.Booths )
        {
            booths.Add( new editHelper() { id = row.ID.ToString(), value = row.tag } );
        }

        return booths;
    }

这是我在编辑后尝试保存一行时遇到的错误:

System.InvalidOperationException: Missing parameter: paintID.
at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection)
at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

任何帮助是极大的赞赏。我已经被困了大约一个月了。

4

1 回答 1

1

我终于弄明白了。我的下拉选择列表中有一些奇怪的值。

我在值周围添加了 " 并解决了问题。

老的:

html += '<option value=' + item.id + '>' + item.value + '</option>';

新的:

html += '<option value="' + item.id + '">' + item.value + '</option>';
于 2012-12-10T18:15:18.330 回答