如何在GridView edititemtemplate中填充DropDownList?

时间:2015-03-03 22:02:00

标签: c# asp.net gridview

我有一个奇怪的问题,我无法找到答案。 我有一个带有一些ItemTemplate的GridView,以及两个单独的EditItemTemplates内的两个DropDownLists。

它们看起来都一样,但只有一个在页面加载中被识别而另一个不是,我收到一个错误:“当前上下文中不存在该名称”

我想用来自DB的数据填充DropDownLists,并使SelectedValue成为Label的值。 HallsDDL工作正常,第二个没有。

我在Google上看到了一些类似的问题,但无法找到答案。

我的aspx:

<asp:GridView ID="gv" runat="server" AllowPaging="true" AllowSorting="true" Font-Size = "13pt" RowStyle-CssClass="cssWidth"  HorizontalAlign="Center" AutoGenerateColumns="false"
  AlternatingRowStyle-BackColor="#EEEEEE"
  OnPageIndexChanging="myGridView_PageIndexChanging"
OnSorting="myGridView_Sorting"
  onrowcancelingedit="GridView1_RowCancelling"
  onrowediting="GridView1_RowEditing"
  onrowupdating="GridView1_RowUpdating" OnRowCommand="GridView1_RowCommand"  OnRowDataBound = "RowDataBound">

  <Columns>           
     <asp:TemplateField HeaderText="מזהה">
        <ItemTemplate>
          <asp:LinkButton PostBackUrl='<%# "~/Events_workers.aspx?RowIndex=" + Container.DataItemIndex %>' runat="server" ID="Order_Id" Text='<%#Eval("Order_Id")%>' CssClass="cssWidth"/>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField HeaderText="שם פרטי" SortExpression="First_Name" >

        <ItemTemplate>
          <asp:Label runat="server" ID="First_Name" Text='<%#Eval("First_Name") %>' CssClass="cssWidth"/>
        </ItemTemplate>


     </asp:TemplateField>
     <asp:TemplateField HeaderText="שם משפחה" SortExpression="Last_Name">

        <ItemTemplate>
          <asp:Label runat="server" ID="Last_Name" Text='<%#Eval("Last_Name") %>' CssClass="cssWidth"/>
        </ItemTemplate>



     </asp:TemplateField>

     <asp:TemplateField HeaderText="תאריך אירוע">

       <ItemTemplate>
         <asp:Label runat="server" ID="EventDate" Text='<%#Eval("EventDate") %>' CssClass="cssWidth" />
       </ItemTemplate>

       <EditItemTemplate>
         <asp:TextBox runat="server" CssClass="cssWidth" ID="txtDate" Text='<%#Eval("EventDate") %>' MaxLength="15" onkeypress='validate(event)' />
         </EditItemTemplate>

      </asp:TemplateField>

      <asp:TemplateField HeaderText="אולם">

       <ItemTemplate>
         <asp:Label runat="server" ID="HallName" Text='<%#Eval("HallName") %>' CssClass="cssWidth" />
       </ItemTemplate>

      <EditItemTemplate>
          <asp:Label ID="HallName" runat="server" Text='<%# Eval("HallName")%>' Visible = "false"></asp:Label>
         <asp:DropDownList  ID="HallsDDL" runat="server" CssClass="cssWidth"></asp:DropDownList>
         </EditItemTemplate>

      </asp:TemplateField>
    <asp:TemplateField HeaderText="סוג אירוע">

       <ItemTemplate>
         <asp:Label runat="server" ID="Event_Name" Text='<%#Eval("Event_Name") %>' CssClass="cssWidth" />
       </ItemTemplate>



      </asp:TemplateField>
         <asp:TemplateField HeaderText="תפריט">

       <ItemTemplate>
         <asp:Label  ID="Menu_Name" runat="server"  Text='<%#Eval("Menu_Name") %>' CssClass="cssWidth" />
       </ItemTemplate>
   <EditItemTemplate>
          <asp:Label ID="Menu_Name" runat="server" Text='<%# Eval("Menu_Name")%>' Visible = "false"></asp:Label>
         <asp:DropDownList  ID="menuDDL" runat="server" CssClass="cssWidth" ></asp:DropDownList>
         </EditItemTemplate>


      </asp:TemplateField>
         <asp:TemplateField HeaderText="כמות אורחים"  SortExpression="Guest_Amount">

       <ItemTemplate>
         <asp:Label runat="server" ID="Guest_Amount" Text='<%#Eval("Guest_Amount") %>' CssClass="cssWidth" />
       </ItemTemplate>
         <EditItemTemplate>
         <asp:TextBox runat="server" CssClass="cssWidth" ID="txtAGuest_Amount" Text='<%#Eval("Guest_Amount") %>' />
         </EditItemTemplate>
      </asp:TemplateField>


  <asp:TemplateField>

  <ItemTemplate>
  <asp:LinkButton ID="btnEdit" Text="ערוך" runat="server" CommandName="Edit" />
  </ItemTemplate>


  <EditItemTemplate>
  <asp:LinkButton ID="btnUpdate" Text="עדכן" runat="server" CommandName="Update" />
  <asp:LinkButton ID="btnCancel" Text="בטל" runat="server" CommandName="Cancel" />
  </EditItemTemplate>

  </asp:TemplateField>

   <asp:TemplateField>

  <ItemTemplate>
  <asp:LinkButton ID="btnDelete"  Text="בטל אירוע" runat="server" CommandName="DeleteRecord" CausesValidation="False"
CommandArgument='<%#Eval("Order_Id") %>'></asp:LinkButton>

</ItemTemplate>

  </asp:TemplateField>

</Columns>
</asp:GridView>

背后的代码:

protected void Page_Load(object sender, EventArgs e)
{
    CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    culture.DateTimeFormat.ShortDatePattern = ("dd/MM/yyyy");
    culture.DateTimeFormat.LongTimePattern = "";
    Thread.CurrentThread.CurrentCulture = culture;
    dal.check_orders_date();
    /* if (Session["admin"] == null)
     {
         Response.Redirect("Admin_Login.aspx");
     }*/
    string state = (string)ViewState["state"];
    name.Text = "אירועים עתידיים:";
    DataTable Halls = new DataTable();
    DataTable Menus = new DataTable();

    if (!IsPostBack)
    {


        Halls = dal.get_halls();
        hallsDDL.DataSource = Halls;
        hallsDDL.DataValueField = "HallName";
        hallsDDL.DataBind();
        Menus = dal.get_Menus();
        //menuDDL.DataSource = Menus;
        //menuDDL.DataValueField = "Menu_Name";
        //menuDDL.DataBind();

        if (state != "edit" || ViewState["myDataTable"] == null)
        {
            BindGridData();
        }
    }

    if (Request.QueryString["fname"] == null && Request.QueryString    ["lname"] == null && Request.QueryString["fdate"] == null && Request.QueryString["tdate"] == null && Request.QueryString["hall_id"] != null)
    {

        System.Data.DataTable ds = dal.Get_orders_by_hall(Convert.ToInt32  (Request.QueryString["hall_id"]));

        SetViewState(ds);
        gv.DataSource = ds;
        gv.DataBind();

    }

}

在halls后面的代码中,当menuDDL不存在时,识别出DDL。 我检查并重新检查了一切,但我似乎无法找到问题。

由于

2 个答案:

答案 0 :(得分:1)

坦率地说,我很惊讶hallsDDL出现在代码隐藏中。您是否在DropDownList之外还有另一个GridView,也称为hallsDDL

GridView等模板化控件中的模板中定义的控件不是GridView本身的类级别字段,也不是DropDownList位于GridView之外的方式将会。该页面没有&#34;知道&#34;关于他们,因为他们是GridView内部的。它们甚至不存在,直到GridView本身被束缚。

这就是人们通常在行级事件中绑定下拉列表和其他可绑定控件的原因,例如RowEditingRowDataBound。这些事件为您提供了对其事件参数中特定行的引用,并允许您通过FindControl方法访问行中的控件。

有关这样做的几个示例,您可以查看此问题并回答:How do you bind a DropDownList in a GridView in the EditItemTemplate Field

答案 1 :(得分:0)

你应该在Page_Load中初始化。

正确无法引用menuDDL

绝对不正确可以引用HallsDDL。

它必须存在于您的代码中的其他位置才能在Page_Load中可用。您无法在不调用FindControl()的情况下引用嵌入式GridView基于行的控件,通常是e.Row.FindControl(),或者可能使用带有GridView.Rows()的ForEach。

我建议您查看流氓asp的页面标记:DropDownList definiton