【问题标题】:Fill DropDownList inside Gridview with corresponding items using Entity Framework使用实体框架用相应的项目填充 Gridview 内的 DropDownList
【发布时间】:2015-02-04 22:47:54
【问题描述】:
protected void GridViewTicketHistory_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow )
    {
        DropDownList drpnop = (DropDownList)e.Row.FindControl("DropDownList1");

        if (drpnop != null)
        {
            foreach (Ticket ticket in entities.Tickets) 
            {
                foreach (State state in entities.States)
                {
                    if (ticket.StateID == state.StateID)
                    {
                        drpnop.DataTextField = state.StateName;
                        drpnop.DataValueField = state.StateID.ToString();
                    }
                }  
            }

            drpnop.DataBind();
        }
    }
}

数据绑定

protected void editCustomerTicket()
{
    GridViewTicketHistory.AutoGenerateEditButton = true;

    DataTable dat = new DataTable();
    int ticketno = Convert.ToInt32(Session["TicketNo"]);

    var a = from employee in entities.Employees
            from ticket in employee.EmployeeTicket
            select new 
            {
                employee.ID,
                employee.Name,
                ticket.TicketNo,
                ticket.Subject,
                ticket.Date,
                ticket.State.StateName
            };

    GridViewTicketHistory.DataSource = a;
    GridViewTicketHistory.DataBind();
}

问题

我使用实体框架,我有 State 和 Tickets 表。Tickets 具有指向 State.(tickets.StateID).In 的导航属性 这段代码我试图查看每个下拉列表以及相应的状态 如果我使用 Command.Writeline 我可以看到 state.StateName 和 state.StateID 不是空的和正确的值。但是我看到是空的 填写下拉列表时的值。

我的目标

我的主要目标是在 下拉列表,但也可以从这些下拉列表中选择修复项目 下列表。假设 StateID=0 StateName=Started StateID=1 StateName=%25 progress StateID=2 StateName=finished 每个单独的工单都有状态 id 和 name 并希望根据它在所有行中显示它 票。也可以从 StateID= 0,1,2 的固定列表中选择。

【问题讨论】:

    标签: c# asp.net entity-framework gridview


    【解决方案1】:

    您需要做的第一件事是在获取GridViewTicketHistory 的数据时避免使用匿名类型,因为您需要将e.Row.DataItem 转换回预定义类型以设置下拉列表的选定项。我会建议以下课程

    public class TicketHistory
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string TicketNo { get; set; }
        public string Subject { get; set; }
        public string Date { get; set; }
        public int? StateID { get; set; }
        public string StateName { get; set; }
    }
    

    如下更改editCustomerTicket 方法,使a 的类型变为List<TicketHistory> 而不是匿名类型。

    protected void editCustomerTicket()
    {
        GridViewTicketHistory.AutoGenerateEditButton = true;
    
        var a = (from employee in entities.Employees
                from ticket in employee.EmployeeTicket
                select new TicketHistory 
                {
                    ID = employee.ID,
                    Name = employee.Name,
                    TicketNo = ticket.TicketNo,
                    Subject = ticket.Subject,
                    Date = ticket.Date,
                    StateID = ticket.StateID,
                    StateName = ticket.State.StateName
                }).ToList();
    
        GridViewTicketHistory.DataSource = a;
        GridViewTicketHistory.DataBind();
    
    }
    

    绑定下拉列表时,您必须在调用.DataBind() 之前设置DataSource 属性或使用循环添加Items 元素。下面的代码使用循环填充下拉列表项,并根据工单的 StateID 设置下拉列表的选定值。

    protected void GridViewTicketHistory_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DropDownList drpnop = (DropDownList)e.Row.FindControl("DropDownList1");
    
            if (drpnop != null)
            {
                // populate drpnop items
                foreach (State state in entities.States)
                {
                    drpnop.Items.Add(new ListItem(state.StateName, state.StateID.ToString()));
                }
    
                // set the selected value of drpnop according to StateID of the ticket
                TicketHistory data = (TicketHistory)e.Row.DataItem;
                if (drpnop.Items.FindByValue(data.StateID.ToString()) != null)
                {
                    drpnop.Items.FindByValue(data.StateID.ToString()).Selected = true;
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。添加时我更改了 drpnop.Items.Add(new ListItem(state.StateName, state.StateID.ToString()));因为它需要 LisItem。但现在它简短地说;无法将匿名类型的对象强制转换为 Ticket。我无法 Ticket data = (Ticket)e.Row.DataItem;像这样投射它,只有一种类型的实体。说明为什么它说匿名类型。因为下拉列表中有 2 个数据?
    • 可以在绑定GridViewTicketHistory的数据源的地方加上代码吗?类似GridViewTicketHistory.DataSource = ...; GridViewTicketHistory.DataBind();
    • 更新是 gridview 不只有一种类型,并且我相信匿名来自 var..
    • employee.EmployeeTicket 的类型是什么?是IEnumerable<EmployeeTicket>吗?
    • 好吧,它来自entities.Employee,EmployeeTicket 是Employee Table 的导航属性。如果我从Get type() 中查看entities.Employee,它的System.Data.Objects.ObjectSet`1[TrackUserModel.Employee ] 类似的东西..
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2011-09-25
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多