我有一个带有DropDownList
的GridView
。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
这在现阶段可能是正常的。因此调试器退出该方法。我希望调试器在尝试向DataGrid
添加行时再次输入onrowdatabound
。不知怎么的,它没有,所以Datasource
永远不会被设置,代码稍后试图向不属于dropdownlist.Items
的dropdownlist
添加一个值,从而导致执行错误:
附加信息:'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的一半?
我想你要做的是将Dropdown
的SelectedValue
设置为Datasource
的Name
,比如这样:
<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;
}
}
}
}