dropdownlist到ASP.Net GridView没有正确绑定

时间:2015-03-04 11:31:40

标签: asp.net gridview

我有GridView DropDownList。 需要将DropDownList项设置到后面的代码中。 我检查了在线代码示例,它看起来我应该这样编码:

<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;autogeneratecolumns="False" 
onrowcommand="DG_Table_RowCommand"  
onrowdatabound="onrowdatabound">  

   <Columns>
     <asp:TemplateField HeaderText="Name" >
      <ItemTemplate>
         <asp:DropDownList ID="Name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
      </ItemTemplate>
   <asp:TemplateField HeaderText="field1" >
      <ItemTemplate>
        <asp:TextBox ID="field1" runat="server" Text='<%# Eval("FieldValue") %>'></asp:TextBox>
     </ItemTemplate>
 </Columns>
 </asp:GridView>

进入代码背后:

public void onrowdatabound(object sender, GridViewRowEventArgs e)
        {

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //check if is in edit mode
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {

                    DropDownList dropdownlist = (DropDownList)e.Row.FindControl("Name");
                    dropdownlist.DataSource = new List<string>() { "Pete", "Jack", "Steve", "Mike", "Rob", "Jim", "Eric" };
                    dropdownlist.DataBind();
                }
            }
        }

调试时,我可以看到调试器进入onrowdatabound。 此时, e.Row.RowType == DataControlRowType.Header

这个阶段可能正常。因此调试器退出该方法。 我希望调试器在尝试向onrowdatabound添加行时再次输入DataGrid。 不管怎样,它都没有,所以Datasource永远不会被设置,稍后代码会尝试向dropdownlist添加一个不属于dropdownlist.Items的值,从而导致执行错误:< / p>

其他信息:'Name' has a SelectedValue which is invalid because it does not exist in the list of items

(这是合乎逻辑的,因为dropdownlist.datasource从未设置过。

调用DG_Table.DataBind()时,有3行:

protected void B_Fill_Fennec_Click(object sender, EventArgs e)
        {
            List<fennec> list_fennec = new List<fennec>() { new fennec("Pete", "dev"), new fennec("Jack", "butcher"), new fennec("Steve", "wood chopper"), };

            GridView1.DataSource = list_fennec.Select(x => new { Name = x.Name, FieldValue = x.Occupation });
            GridView1.DataBind();
        }

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

在你的标记中你有这行无效:

<asp:DropDownList ID="Name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>

首先,因为您打开了DropDownList代码并关闭了TextBox代码。 (我假设在提问和改变代码时这是一个错误。)

其次Text='<%# Bind("Name") %>'在那里无效(看起来这是TextBox退化的一半?

我认为您尝试做的是将SelectedValue的{​​{1}}设置为Dropdown这样的Name:< / p>

Datasource

代码隐藏:

<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;autogeneratecolumns="False" 
onrowcommand="DG_Table_RowCommand"  
onrowdatabound="onrowdatabound">  

   <Columns>
     <asp:TemplateField HeaderText="Name" >
      <ItemTemplate>
         <asp:HiddenField id="hdn_Name" runat="server" value='<%# Eval("Name") %>' />
         <asp:DropDownList ID="Name" runat="server" />
      </ItemTemplate>
   <asp:TemplateField HeaderText="field1" >
      <ItemTemplate>
        <asp:TextBox ID="field1" runat="server" Text='<%# Eval("FieldValue") %>'></asp:TextBox>
     </ItemTemplate>
 </Columns>
 </asp:GridView>