Почему я получаю строку; текст перед значением поля списка SharePoint, когда я его извлекаю?

Я новичок в **. NET ** и, более того, в SharePoint, и у меня возникла следующая проблема при работе над проектом SharePoint 2013.

В моем коде я делаю:

for (int i = 0; i < eitchettaCorrenteList.Items.Count; i++)
{
    string valoreColonnaIniziativaInternalName = eitchettaCorrenteList.Fields[nomeColonna].InternalName;

    string valore = eitchettaCorrenteList.Items[i][valoreColonnaIniziativaInternalName].ToString();
}

Я просматриваю список SharePoint с именем etichettaCorrentList и для каждой строки извлекаю значение определенного поля.

Это работает, но проблема в том, что эта строка:

string valore = eitchettaCorrenteList.Items[i][valoreColonnaIniziativaInternalName].ToString();

возвращает странное значение, которое содержит ожидаемое значение (содержащееся в моем списке), которому предшествует код, не являющийся частью значения выбранного поля, например: строка; # S01-INIZIATIVA EUROPA 1 TEST

Что это за строка;? Зачем я его забираю? Как я могу правильно удалить или не получить эту строку; перед желаемой информацией? Что не так? Что мне не хватает?


person AndreaNobili    schedule 12.12.2018    source источник
comment
какой тип данных - eitchettaCorrenteList.Items [i] [valoreColonnaIniziativaInternalName]? Возможно, функция ToString тоже возвращает информацию о метаданных   -  person Joe Taras    schedule 12.12.2018
comment
Не используйте ToString(). Существует много различных типов полей, включая поисковые запросы (в которых хранятся как идентификатор, так и текст), изображения, многозначные текстовые поля, поисковые запросы и т. Д. Как вы написали код, вы получаете внутренние данные.   -  person Panagiotis Kanavos    schedule 12.12.2018
comment
Можете ли вы сказать, в каком типе поля находится это значение? Вы можете увидеть его в списке SharePoint в настройках списка. Каждый тип поля может быть приведен к определенным для классов SharePoint .NET. У этого класса есть собственные методы для правильного получения значения. И может быть, если вы будете использовать этот правильный класс для получения значения, ваша проблема будет решена.   -  person    schedule 12.12.2018
comment
Это вычисляемое значение, которое просто объединяет 2 текстовых поля. Какой метод я могу использовать?   -  person AndreaNobili    schedule 12.12.2018
comment
String strPrice = priceField.GetFieldValueAsText(item["Retail_x0020_Price"]) Источник: docs.microsoft.com/en-us/previous-versions/office/developer/   -  person Cleptus    schedule 12.12.2018
comment
Почему вы используете такой код? Вы не найдете этого ни в одном учебном пособии. Например, вместо цикла for вы найдете foreach (SPListItem it in items). Вместо получения всех полей (дорогостоящая операция) образцы показывают вызов var items=list.GetItems("Title", "ISBN", "Retail_x0020_Price"); для получения только необходимых полей. Поскольку вы используете серверный API, проверьте Как: прочитать значение поля в элементе списка.   -  person Panagiotis Kanavos    schedule 12.12.2018
comment
@AndreaNobili нет вычисляемых значений в SharePoint. Списки - это не таблицы, а поля - не столбцы. Вы можете использовать GetFieldValueAsText(), чтобы получить значение, отображаемое как текст, или GetFieldValueAsHtml(Object), если хотите, чтобы оно было отформатировано для отображения как HTML. Кстати, если бы вы использовали API на стороне клиента, получение данных было бы намного быстрее. Вы можете использовать запрос LINQ, чтобы получить то, что хотите   -  person Panagiotis Kanavos    schedule 12.12.2018


Ответы (1)


Воспользуйтесь этой ссылкой.

Вот ответ на ваш вопрос. Тип вашего поля - SPFieldCalculated. Используйте такой код:

var item = eitchettaCorrenteList.Items[i];
var field = eitchettaCorrenteList.Fields[nomeColonna];
string valoreColonnaIniziativaInternalName = field.InternalName;
if (field.Type.Equals(SPFieldType.Calculated)) {
}
    SPFieldCalculated cf = (SPFieldCalculated)field;
    string valore = cf.GetFieldValueForEdit(item[valoreColonnaIniziativaInternalName ]);
    // or 
    // string valore = cf.GetFieldValueAsText(item[valoreColonnaIniziativaInternalName ]);
}
else {
    string valore = item[valoreColonnaIniziativaInternalName].ToString();
}

Или, может быть, это будет работать правильно во всех случаях:

var item = eitchettaCorrenteList.Items[i];
var field = eitchettaCorrenteList.Fields[nomeColonna];
var value = field.GetFieldValueAsText(item[field.InternalName]);
person Community    schedule 12.12.2018