【问题标题】:Access columns in ItemDataBound event when the datasource is Linq数据源为 Linq 时访问 ItemDataBound 事件中的列
【发布时间】:2009-09-24 10:46:59
【问题描述】:

我使用以下代码设置数据源:

    protected void Page_Load(object sender, EventArgs e)
    {
        var vacancies = from v in db.Vacancies
                    join c in db.Customers on v.CustomerID equals c.CustomerID
                    join cp in db.CustomerPortals on c.CustomerID equals cp.CustomerID
                    where cp.PortalID == Master.Portal.ID
                    select new
                    {
                        Title = v.Title,
                        Internship = (v.ContractID == 6),
                        Hours = v.Hours,
                        City = v.Customer.City.Name,
                        Degree = v.Degree.Title,
                        Contract = v.Contract.Title,
                        CustomerID = v.CustomerID
                    };
        rVacancies.ItemDataBound += new RepeaterItemEventHandler(rVacancies_ItemDataBound);
        rVacancies.DataSource = vacancies;
        rVacancies.DataBind();
    }

现在我想知道如何从 ItemDataBound 事件中访问其中的一列(如 CustomerID)。

    void rVacancies_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
         // This doesnt seem to work, row would be null even though e.Item.DataItem has a value.
         DataRow row = (DataRow)e.Item.DataItem;
    }

我发现 e.Item.DataItem 包含我查询中的所有字段,并且 e.Item.DataItem 的类型是

f__AnonymousType8<string,bool,byte,string,string,string,long>

【问题讨论】:

    标签: c# asp.net linq


    【解决方案1】:

    终于找到了,简单如下:

    long customerID = long.Parse(DataBinder.Eval(e.Item.DataItem, "CustomerID").ToString());
    

    【讨论】:

      【解决方案2】:

      这种 .Net 4.0 方法确实也很酷!

      public void PersonDataBound(object sender, RepeaterItemEventArgs e)
      {
          if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
          {
              dynamic person = e.Item.DataItem as dynamic;
      
              string name = person.Name;
              int age = person.Age;
          }
      }
      

      全部归功于: http://www.kristofclaes.be/blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/

      由于页面现在显示错误 404,因此这是来自 Wayback Machine 的页面: Anonymous types and the ItemDataBound event (Archived version)

      【解决方案3】:

      您没有将数据行绑定到您的控件(您正在绑定匿名类型),因此您不应将 DataItem 强制转换为 DataRow。

      尝试将您的行的数据获取为:

      var dataItem = e.Item.DataItem;
      // For example get your CustomerID as you defined at your anonymous type :
      string customerId = dataItem.CustomerID;
      

      【讨论】:

      • 所以我在这个游戏上迟到了两年,但没有人注意到这不会编译? “var” 仍然尝试在设计时推断数据类型,并且由于它是匿名类型,因此无法执行此操作。此代码应在第二行显示错误“无法解析符号‘CustomerID’。假设 .NET 4.0,RobD 的方法是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多