【问题标题】:Check if a column with a given name exists in a datarow检查数据行中是否存在具有给定名称的列
【发布时间】:2013-10-15 08:34:26
【问题描述】:

如何检查填充列表视图的结果中是否存在列? 列表视图由存储过程填充。

这是我尝试过的,但没有成功:

<%#  Container.DataItem.GetType().GetProperty("Phone")==null?"phone is null":"we have phone property" #>

或者我应该使用 e 而不是 Container.DataItem

【问题讨论】:

    标签: c# asp.net listview data-binding datarow


    【解决方案1】:

    首先,如果代码隐藏变得复杂,我会使用它(我几乎总是使用它)。在这里,我将使用 ListView 的 ItemDataBound event,它为每个项目触发:

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            // assuming you have an ItemTemplate with a label where you want to show this
            Label lblInfo = (Label) e.Item.FindControl("LblInfo");
            DataRowView rowView = (DataRowView)e.Item.DataItem;
            if (rowView.Row.Table.Columns.Contains("Phone"))
            {
                lblInfo.Text = "we have the phone property";
            }
            else
            {
                lblInfo.Text = "no phone available";
            }
        }
    }
    

    这使得代码更具可读性、可维护性、可调试性和类型安全性。

    【讨论】:

      【解决方案2】:

      另外,我找到了解决办法:

          public bool CheckProperty(string property_name)
          {
      
              try
              {
                  Eval(property_name);
              }
              catch { return false; }
              return true;
      
          }
      

      【讨论】:

      • 不要使用Try-Catch 作为逻辑运算符。这是非常低效的。
      • Try-Catch 不会影响性能,但异常可以。而且由于您在这里循环可能包含多个列的许多项目,因此它确实可能对性能至关重要。然而,即使它不影响性能,踢也是一个坏习惯。不,异常永远不是正常流程控制的正确工具。异常只能用于表示函数/方法由于外部原因无法履行其合同。
      【解决方案3】:

      您可以在 OnItemDataBound 中检查。

       protected void lstSample_OnItemDataBound(object sender, ListViewItemEventArgs e)
          {
              Label lblText = null;
              Boolean isColumnExists = false;
              if (e.Item.ItemType == ListViewItemType.DataItem)
              {
                  DataRowView dr = (DataRowView)e.Item.DataItem;
                  isColumnExists  = dr.DataView.Table.Columns.Contains("Hello");
                  lblText = (Label)e.Item.FindControl("lbltext");
                  if (isColumnExists)
                  {
      
                      lblText.Text = dr.Row["Hello"].ToString();
                  }
                  else
                  {
                      lblText.Text = dr.Row["Movies"].ToString();
                  }
              }
          }
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2010-12-31
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2019-03-01
        • 1970-01-01
        相关资源
        最近更新 更多