【问题标题】:How to populate DropDownList in GridView edititemtemplate?如何在 GridView edititemtemplate 中填充 DropDownList?
【发布时间】:2015-03-03 22:01:59
【问题描述】:

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

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

我想用数据库中的数据填充两个 DropDownLists,并使 SelectedValue 成为标签的值。 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();

    }

}

在 hallsDDL 后面的代码中识别出 menuDDL 不存在。 我检查并重新检查了所有内容,但似乎找不到问题。

谢谢

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    坦率地说,我很惊讶hallsDDL 出现在代码隐藏中。你在GridView之外还有另一个DropDownList,也叫hallsDDL吗?

    在模板化控件(如GridView)中的模板中定义的控件不是GridView 本身的类级别字段,也不是位于GridView 之外的DropDownList 的方式。该页面不“了解”它们,因为它们在 GridView 内部。它们甚至在GridView 本身被绑定之后才存在。

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

    关于这样做的几个例子,你可以看看这个问题和答案:How do you bind a DropDownList in a GridView in the EditItemTemplate Field

    【讨论】:

    • 这只是关于名称和绑定来源的大混淆。现在可以了,谢谢
    【解决方案2】:

    您应该在 Page_Load 中进行初始化。

    正确不能参考menuDDL

    可以引用 HallsDDL 是绝对不正确

    它必须存在于代码中的其他位置才能在 Page_Load 中使用。如果不调用 FindControl(),通常是 e.Row.FindControl() 或者可能将 ForEach 与 GridView.Rows() 一起使用,则无法引用嵌入式 GridView 基于行的控件。

    我建议你检查页面标记是否有流氓 asp:DropDownList 定义

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多