C# DataRow пустая проверка

Я получил это:

 DataTable dtEntity = CreateDataTable();
 drEntity = dtEntity.NewRow();

Тогда я добавляю данные к строке (или не). Много кода, действительно не знайте, существует ли что-нибудь в строке. Зависит от входа (я импортирую из некоторых файлов). Я хотел бы сделать что-то как:

 if (drEntity`s EVERY CELL IS NOT EMPTY)
 {
   dtEntity.Rows.Add(drEntity);
 }
 else
 {
   //don't add, will create a new one (drEntity = dtEntity.NewRow();)
 }

Там некоторый хороший путь состоит в том, чтобы проверить, пуста ли каждая ячейка DataRow? Или я должен foreach, и проверять их один за другим?

18
задан Ash 24 February 2010 в 13:38
поделиться

5 ответов

Простой метод типа:

bool AreAllColumnsEmpty(DataRow dr)
{
 if (dr == null)
 {
  return true;
 }
 else
 {
  foreach(var value in dr.ItemArray)
  {
    if (value != null)
    {
      return false;
    }
  }
  return true;
 }
}

Должен дать вам то, что вы ищете, а чтобы сделать его "красивым" (поскольку в Framework, насколько я знаю, ничего такого нет), вы можете обернуть его как метод расширения, и тогда ваш результирующий код будет выглядеть так:

if (datarow.AreAllColumnsEmpty())
{
}
else
{
}
25
ответ дан 30 November 2019 в 06:14
поделиться
public static bool AreAllCellsEmpty(DataRow row)
{
  if (row == null) throw new ArgumentNullException("row");

  for (int i = row.Table.Columns.Count - 1; i >= 0; i--)
    if (!row.IsNull(i))
      return false;

  return true;
}
5
ответ дан 30 November 2019 в 06:14
поделиться

Вы можете использовать следующее:

if(drEntity.ItemArray.Where(c => IsNotEmpty(c)).ToArray().Length == 0)
{
    // Row is empty
}

IsNotEmpty(cell) будет вашей собственной реализацией, проверяющей, являются ли данные нулевыми или пустыми, основываясь на том, какой тип данных находится в ячейке. Если это простая строка, то в итоге это может выглядеть примерно так:

if(drEntity.ItemArray.Where(c => c != null && !c.Equals("")).ToArray().Length == 0)
{
    // Row is empty
}
else
{
    // Row is not empty
}

Тем не менее, по сути, это проверяет каждую ячейку на пустоту и позволяет узнать, все ли ячейки в строке пусты.

2
ответ дан 30 November 2019 в 06:14
поделиться

Хотя это не ответ на ваш главный вопрос, стоит отметить, что когда MVC генерирует имена, это превращает что-то вроде Тэги в Project_Tags, заменяя точки подчеркиванием.

Причиной этого является то, что точка в идентификаторе элемента будет выглядеть как элемент Project с классом Тэгов к CSS. Ясно, что это плохо, поэтому перевод подчеркивает, чтобы держать поведение предсказуемым.

В вашем первом примере

<%= Html.ListBoxFor(c => c.Project.Categories,
    new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>

listbox пытается выполнить привязку к Model.Project.Categories для сильно типизированной модели, которая была предоставлена странице (с помощью лямбда-нотации). Я не уверен, что делает второй параметр в ListAxFor.

Какова модель, передаваемая на страницу?

-121--1362042-

Невозможно указать или изменить белый список с помощью библиотеки AntiXSS, что не странно, когда вы думаете об этом. Библиотека AntiXSS по умолчанию кодирует все символы, не входящие в следующий диапазон: 0..9a..zA..Z. Этот набор символов безопасен (и поэтому находится в белом списке), и их кодирование не требуется. Обратите внимание, что библиотека AntiXSS содержит различные списки для кодирования javascript, html и url. Не используйте HTML-код для URL-адресов, так как в приложении будет пробел безопасности.

Обратите внимание, что белый список в GroupEncode работает иначе, чем белый список в GetSafeGroupFragment . С помощью GroupEncode вы говорите «пожалуйста, закодируйте каждый символ, который отсутствует в белом списке», с помощью GetSafeGroupFragment вы говорите «пожалуйста, удалите все тэги и атрибуты, которые отсутствуют в белом списке».

Когда вы используете ASP.NET 4.0, я был бы совет вы, чтобы не пользоваться библиотекой AntiXSS (непосредственно), но просто использовать построенный в механизмах (таких как HttpUtility), чтобы закодировать HTML. ASP.NET 4.0 позволяет настроить в файле конфигурации . Вы можете написать свой собственный StartEncoder , использующий библиотеку AntiXSS (вполне вероятно, что будущая версия библиотеки AntiXSS будет содержать реализацию StartEncoder ). При этом все приложение (и все ASP.NET элементы управления и пользовательские элементы управления) будет использовать кодировку белого списка вместо кодировки черного списка.

ASP.NET 4,0 также вводит новый кодовый блок для кодированного текста . Можно использовать имя: <%: Model.FirstName% > . Тем не менее, я лично нахожу <% = StartUtility.StartEncode (Model.FirstName)% > более явным.

-121--1670518-

AFAIK, нет метода, который делает это в рамках. Даже если бы в рамках была поддержка чего-то подобного, она, по сути, делала бы то же самое. И это будет смотреть на каждую ячейку в DataRow, чтобы увидеть, является ли она пустой.

0
ответ дан 30 November 2019 в 06:14
поделиться

Возможно, лучшим решением было бы добавить дополнительный столбец, который автоматически устанавливается в 1 в каждой строке. Как только появится элемент, который не является нулевым, измените его на 0.

затем

If(drEntitity.rows[i].coulmn[8] = 1)
{
   dtEntity.Rows.Add(drEntity);
}
 else
 {
   //don't add, will create a new one (drEntity = dtEntity.NewRow();)
 }
0
ответ дан 30 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: