【问题标题】:How to check in all visible rows CELLs for string.IsNullOrEmpty and IsDateEmpty如何在所有可见行 CELL 中检查 string.IsNullOrEmpty 和 IsDateEmpty
【发布时间】:2016-04-25 07:02:08
【问题描述】:

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

以下代码(用于检查可见单元[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";
}

以下代码(用于检查第二个 Cell 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.Web.UI.ControlCollection.get_Item(Int32 index) at Lirex.WayBillModule.b__2f(TableRow row) at System.Linq.Enumerable.Any[TSource](IEnumerable1 source, Func2 predicate)处的索引>

【问题讨论】:

  • 什么不起作用?你有任何错误吗?

标签: c# asp.net .net linq


【解决方案1】:

通过使用此行(). All(row =&gt; row.Visible);,您正在获取所有行的可见属性,而不是您预期的行。所以像下面这样使用来选择行

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

【讨论】:

    【解决方案2】:

    如果可行,您可以尝试以下方法,它将检查所有可见行上的空文本框,只需修改以检查其他控件类型。

            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));
    

    【讨论】:

    • 只需根据您的要求将 IsNullorEmpty 更改为 IsNullorWhiteSpace。
    • 或者干脆忘记foreach循环,直接在tableRows中查询。。微调的foreach条件会返回true或false。像我为 hasEmptyTextBox 部分所做的那样对其进行模式化。干杯。
    【解决方案3】:

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2010-10-14
      相关资源
      最近更新 更多