如何检查string.IsNullOrEmpty和IsDateEmpty的所有可见行CELL

时间:2016-04-25 07:02:08

标签: c# asp.net .net linq

我有一个带有行的表格,我用按钮点击事件显示/隐藏。我想检查我的所有可见行,其中包含string.IsNullOrEmpty和IsDateEmpty的单元格索引。 怎么做?

enter image description here

以下代码(用于检查可见单元格[0] TextBox)无效:

var allVisibleRows = myTbl.Rows.Cast<TableRow>().Where(row => row.Visible);
bool anyTextBoxEmpty = allVisibleRows.Any(row => string.IsNullOrEmpty(((TextBox)row.Cells[0].Controls[0]).Text));
//DestinavionValidation
if (anyTextBoxEmpty)
{
    return "Please, insert a TEXT";
}

以下代码(用于检查第二个单元格1 DateTimeControl)无效:

bool anyDateTimeOneValid = allVisibleRows.Any(row => !(((DateTimeControl)row.Cells[1].Controls[0])).IsValid);
bool anyDateTimeOneEmpty = allVisibleRows.Any(row => (((DateTimeControl)row.Cells[1].Controls[0])).IsDateEmpty);
//Date Validation
if (anyDateTimeOneValid || anyDateTimeOneEmpty)
{
    return "Please, insert a Date!";
}

这是以下错误

  

System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围。参数名称:在System.Linq.Enumerable.Any [TSource](IEnumerable 1 source, Func 2谓词)的Lirex.WayBillModule.b__2f(TableRow行)的System.Web.UI.ControlCollection.get_Item(Int32索引)处的索引/ p>

3 个答案:

答案 0 :(得分:2)

通过使用此行(). All(row => row.Visible);,您将获取所有行的可见属性,而不是您所期望的行。因此,请使用以下选择行

var tableRow = myTbl.Rows.Cast<TableRow>().Where(row => row.Visible);

答案 1 :(得分:1)

Enumerable.All返回bool,您希望所有可见行都使用Where

var allVisibleRows = myTbl.Rows.Cast<TableRow>().Where(row => row.Visible);

您现在想要检查第一个单元格中是否有空TextBox

bool anyTextBoxEmpty =  allVisibleRows
    .Any(r => String.IsNullOrWhiteSpace(((TextBox)r.Cells[0].Controls[0]).Text));

答案 2 :(得分:1)

你可以尝试下面如果能够工作,它将检查所有可见行上的空文本框,只需修改以检查其他控件类型。

        var tableRows = Table1.Rows.Cast<TableRow>().Where(row => row.Visible);

        bool hasEmptyField = false;
        foreach (var row in tableRows.Where(row => row.Cells.Cast<TableCell>()
            .SelectMany(
                item => item.Controls.Cast<Control>()
                    .Where(cntrl => cntrl.GetType() == typeof (TextBox)))
            .Any(cntrl => string.IsNullOrEmpty(((TextBox) cntrl).Text))))
        {
            hasEmptyField = true;
            break;
        }

        if (hasEmptyField)
        {
            //Do what you want...
        }

编辑答案。上次查询仅检查最后一个可见行。进行了一些更改,现在使用WHERE子句而不是LAST获取可见行。更改还包括每行的循环。

以下是我发布的原始代码,仅检查最后一行。

        var tableRow = Table1.Rows.Cast<TableRow>().Last(row => row.Visible);
        var hasEmptyTextBox =
            tableRow.Cells.Cast<TableCell>()
                .SelectMany(
                    item => item.Controls.Cast<Control>()
                        .Where(cntrl => cntrl.GetType() == typeof(TextBox)))
                .Any(cntrl => string.IsNullOrEmpty(((TextBox)cntrl).Text));