dropdownlist到ASP.Net GridView的绑定不正确



我有一个带有DropDownListGridViewDropDownList项需要设置到代码隐藏中。我检查了在线代码样本,看起来我应该这样编码:

<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

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

附加信息:'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();
        }

感谢您的帮助。

在标记中有一行无效:

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

首先,因为您打开了一个DropDownList标记并关闭了一个TextBox标记。(我认为这是在询问问题和修改代码时出现的错误)。

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

我想你要做的是将DropdownSelectedValue设置为DatasourceName,比如这样:

<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>

CodeBehind:

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();
               var nameField = e.Row.FindControl("hdn_Name") as HiddenField;
               if(nameField != null)
               {
                   dropdownlist.SelectedValue = nameField.Value;
               }
        }
    }
 }

最新更新