【问题标题】:Filter data from datatable for one of columns in asp.net从数据表中过滤 asp.net 中某一列的数据
【发布时间】:2019-06-27 05:56:06
【问题描述】:

我有一个datatable,它可以获取一些记录。所以有一个列名为UPDATED_STATUS。在该列中,Pre HotoPost Hoto 值将出现。

所以我想要的是,这些值中的任何一个都应该是它们在该列中,然后只有它应该向前移动,否则它应该提示警报

Pre Hoto 或 Post Hoto 都可以是他们的

以下是示例图片供参考

下面是使用UPDATED_STATUS 列获取datatable 的代码

if (strFlag == "")
                    {
                        dtStatus = GET_STATUS_FROM_SAPID_FOR_HOTO(dtExcelRows.Rows[i]["Current SAPID"].ToString());

                        if (dtStatus == null && dtStatus.Rows.Count < 0)
                        {
                            ClientScript.RegisterStartupScript(Page.GetType(), "erroralert", "alert('Status cannot be blank for SAP ID entered');", true);
                        }
                        else
                        {
                            dtExcelRows.Rows[i]["UPDATED_STATUS"] = dtStatus.Rows[0][1].ToString();
                            dtExcelRows.AcceptChanges();
                        }
                    }

【问题讨论】:

  • 更改 (dtStatus == null || dtStatus.Rows.Count == 0 到 (dtStatus == null && dtStatus.Rows.Count

标签: c# asp.net filter datatable


【解决方案1】:

您当前的支票 (if (dtStatus == null &amp;&amp; dtStatus.Rows.Count &lt; 0)) 有误:

  1. 当 dtStatus 为 null 时,继续检查 dtStatus.Rows,这会引发 nullref 异常(您刚刚发现它为 null);
  2. Rows.Count 永远不会小于零。

尝试if (dtStatus == null || dtStatus.Rows.Count == 0) 检查是否根本没有状态(它是null)或没有状态行(计数为零)。当发现 dtStatus 为空时,|| 将阻止检查 dtStatus.Rows。

&amp;&amp; 表示两边必须同时为true
|| 表示至少两边必须为真(两者都为真也可以)。
当第一个测试已经决定结果时,两者都不会评估第二个测试(假 && 永远为假,真 || 永远为真)

【讨论】:

  • 你说的是哪个代码..我的回答部分还是我的问题?
  • 在问题中,但现在我看到它也在你的答案中
  • 哦,我仍然对出了什么问题感到困惑..你能更新我的答案代码并提出一个新的答案吗?以便我可以调试和验证。如果您需要我的任何东西,请告诉我
  • 只需将我标记为“您当前的检查”的内容替换为“尝试”即可。这是您的示例中的第三个代码行
  • 谢谢汉斯,更新了我的代码。也为您的指南投票
【解决方案2】:

你在找这样的吗!

foreach (DataRow row in dtStatus.Rows)
{
  if (string.IsNullOrEmpty(Convert.ToString(row["UPDATED_STATUS"])) || 
     (Convert.ToString(row["UPDATED_STATUS"]).ToLower() != "pre hoto" && 
     Convert.ToString(row["UPDATED_STATUS"]).ToLower() != "post hoto"))
     {
          ClientScript.RegisterStartupScript(Page.GetType(), "erroralert", "alert('Status cannot be blank for SAP ID entered');", true);
          break;
     }
     else { }
}

【讨论】:

  • 我使用 DataRows 循环来检查条件
  • 它不工作。即使状态相同,也总是进入 else
【解决方案3】:

我有办法完成这项工作.. 我去

if (strFlag == "")
                    {
                        dtStatus = GET_STATUS_FROM_SAPID_FOR_HOTO(dtExcelRows.Rows[i]["Current SAPID"].ToString());

                        if (dtStatus == null && dtStatus.Rows.Count < 0)
                        {
                            ClientScript.RegisterStartupScript(Page.GetType(), "erroralert", "alert('Status cannot be blank for SAP ID entered');", true);
                        }
                        else
                        {
                            dtExcelRows.Rows[i]["UPDATED_STATUS"] = dtStatus.Rows[0][1].ToString();
                            dtExcelRows.AcceptChanges();
                        }
                    }
                }

                DataTable dtGetHotoPre = null;
                var rows = dtExcelRows.AsEnumerable().Where(x => x.Field<string>("UPDATED_STATUS") == "PRE HOTO");

                if (rows.Any())
                {
                    dtGetHotoPre = rows.CopyToDataTable();
                }

                DataTable dtGetHotoPost = null;
                var rowsPost = dtExcelRows.AsEnumerable().Where(x => x.Field<string>("UPDATED_STATUS") == "POST HOTO");

                if (rowsPost.Any())
                {
                    dtGetHotoPost = rowsPost.CopyToDataTable();
                }
                string strFlagStatus = "";
                if (dtGetHotoPre != null)
                {
                    if (dtGetHotoPost != null)
                    {
                        strFlagStatus = "No Process";
                    }
                    else
                    {
                        strFlagStatus = "Process";
                        grdDvHoto.DataSource = dtGetHotoPost;
                    }
                }
                else
                {
                    if (dtGetHotoPost != null)
                    {
                        strFlagStatus = "Process";
                        grdDvHoto.DataSource = dtGetHotoPre;
                    }
                    else
                    {
                        strFlagStatus = "No Process";
                    }
                }

               // if(dtGetHotoPre != null && dtGetHotoPost != null)

                if (strFlagStatus == "No Process")
                {
                    ClientScript.RegisterStartupScript(Page.GetType(), "erroralert", "alert('The sites contains both Pre and Post Hoto Status, so it cannot be uploaded');", true);
                }
                else 
                {
                    // will move ahead.                        
                    grdDvHoto.DataBind();
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2022-11-22
    • 1970-01-01
    • 2021-01-05
    • 2021-08-16
    相关资源
    最近更新 更多