1

我有一个代表这样的 Sharepoint 列表的类:

private class ListColumns
{
    public String li_requestDate { get; set; }
    public String li_paymentAmount { get; set; }
    public String li_payeeName { get; set; }
    public String li_remitAddressOrMailStop { get; set; }
    . . .

我阅读了以前保存到 Sharepoint 列表中的项目,如下所示:

private List<ListColumns> ReadFromList()
{
    List<ListColumns> lcList = new List<ListColumns>();

    using (SPSite site = new SPSite(siteUrl))
    {
        using (SPWeb web = site.RootWeb)
        {
            SPList list = web.Lists[listTitle];
            SPListItemCollection SpListColl = list.Items;
            foreach (SPListItem item in SpListColl)
            {
                ListColumns lc = new ListColumns();
                lc.li_requestDate = item["RequestDate"].ToString();
                lc.li_payeeName = item["PayeeName"].ToString();
                lc.li_remitAddressOrMailStop = item["RemitAddressOrMailStop"].ToString();
                . . .

如果分配给类成员的值是空字符串,则此代码崩溃 - IOW,尝试将空字符串分配给这些类成员中的任何一个会导致 ReadFromList() 的 catch 方法充当指向它的 GOTO 语句已达到(就此而言,没有收取 200 美元或任何金额)。

我可以用像这样的笨拙/乏味的代码来防止这种情况:

if (!(String.IsNullOrEmpty(item["RequestDate"].ToString())))
{
    lc.li_requestDate = item["RequestDate"].ToString();
}
if (!(String.IsNullOrEmpty(item["PayeeName"].ToString())))
{
    lc.li_payeeName = item["PayeeName"].ToString();
}
. . .

(等等等等 ad nauseum ad finitum adwords with friends &c)

...但是有一个暗示必须有一个“更好”的方法。谁能具体证实我的直觉?

更新

尝试亚历克斯的代码:

item.SetAsString("RequestDate", x => lc.li_requestDate = x);

如果值为空,我仍然会得到“对象引用未设置为对象的实例”。

MatteoSP 的代码:

Apply(item, "RequestDate", x => lc.li_requestDate = x);

...甚至不编译;我收到两个错误消息:

'DirectPaymentSectionsWebPart.DPSVisualWebPart.DPSVisualWebPartUserControl.Apply(System.Collections.Generic.IDictionary, string, System.Action)' 的最佳重载方法匹配有一些无效参数

-和:

参数 1:无法从 'Microsoft.SharePoint.SPListItem' 转换为 'System.Collections.Generic.IDictionary'

更新 2

我的 kludgy/verbose 代码,我认为至少可以工作:

if (!(String.IsNullOrEmpty(item["RemitAddressOrMailStop"].ToString())))
{
    lc.li_remitAddressOrMailStop = item["RemitAddressOrMailStop"].ToString();
}

...也因钝的“对象引用未设置为对象的实例”反对而失败。

是否有必要通过在写入列表时为每个其他可能为空的值写一个“”(空格)来将 Kludginess 提升得更高?

更新 3

我也尝试了Shaw在此处发布的想法,但结果相同(崩溃,“对象引用未设置为对象的实例”)

4

3 回答 3

2

如何使用扩展方法

public static class ListItemExtensions
{
    public static void SetAsString(this SPListItem item, string colName, Action<string> destSetter)
    {
        if (item != null)
        {
            var col = item[colName];
            if (col != null)
            {
                var colVal = col.ToString();
                if (!string.IsNullOrEmpty(colVal))
                    destSetter(colVal);
            }
        }
    }
}

用法:

 item.SetAsString("RequestDate", x => lc.li_requestDate = x);
于 2015-05-05T22:47:20.463 回答
1

你可以这样定义:

    static void Apply(IDictionary<string, object> dict, string key, Action<string> setter)
    {
        if (!dict.ContainsKey(key) || string.IsNullOrEmpty(dict[key].ToString()))
            return;

        setter(dict[key].ToString());
    }

然后以这种方式使用它:

Apply(item, "RequestDate", x => lc.li_requestDate = x);
Apply(item, "PayeeName", x => lc. li_payeeName = x);
于 2015-05-05T22:46:24.750 回答
0

在带着孩子手套处理数据之后,我让它开始工作。

从列表中读取的代码仍然是这样的:

if (!(String.IsNullOrEmpty(item["RequestDate"].ToString())))
{
    lc.li_requestDate = item["RequestDate"].ToString();
}

...但是写入列表的代码已经变得非常束手无策,就像这样:

if (null != boxFundingApproverPrinted)
{
    if (String.IsNullOrEmpty(boxFundingApproverPrinted.Text))
    {
        spli["FundingApproverName"] = "[left blank]";
    }
    else
    {
        spli["FundingApproverName"] = boxFundingApproverPrinted.Text;
    }
}
else
{
    spli["FundingApproverName"] = "[left blank]";
}

...诚然,它很笨拙(笨拙且乏味),但它有效...(我在完成所有操作后看到了 Alex 的更新)。

于 2015-05-06T21:00:23.393 回答