我有一个GridView。每当我在选择下拉值后点击LinkButton时,我只会获得下拉菜单中的第一项。 我需要在TextBox中显示所选的值。我怎样才能获得理想的价值? 这是我的伪代码:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EnableModelValidation="True"
OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("ID")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Count">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" EnableViewState="true" AutoPostBack="false">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Button">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
背后的代码:
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("Count", typeof(string));
dt.Rows.Add("A", "5");
dt.Rows.Add("B", "8");
dt.Rows.Add("C", "4");
dt.Rows.Add("D", "7");
dt.Rows.Add("E", "9");
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList ddl = (DropDownList)e.Row.FindControl("DropDownList1");
ddl.Items.Clear();
int count = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Count").ToString());
List<string> list = new List<string>();
for (int i = 1; i <= count; i++)
{
list.Add(i.ToString());
}
ddl.DataSource = list;
ddl.DataBind();
}
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
GridViewRow grdrow = (GridViewRow)((LinkButton)sender).NamingContainer;
DropDownList ddl = (DropDownList)GridView1.Rows[grdrow.RowIndex].FindControl("DropDownList1");
TextBox1.Text = ddl.SelectedValue.ToString();
}
提前致谢...
答案 0 :(得分:0)
我猜你应该用数据绑定实现INotifyProperty更改。这样,将记录每个更改,包括在下拉框中第一次更改后进行的更改。见〜http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
答案 1 :(得分:0)
由于您是动态创建和绑定Dropdownlist,因此在执行click事件时不会加载它。为了使用绑定属性(在这种情况下为selectedValue
属性),必须已加载控件,并且控件解析并设置了视图状态信息。
创建下拉列表的数据绑定事件在预呈现后运行。有关页面生命周期的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.85%29.aspx。
要做你想要的事情,需要非常密切关注页面生命周期。尝试将设置文本框的代码移动到GridView1_RowDataBound
方法。为了使其工作,您的控件必须每次都使用相同的属性呈现(这样它上面的事件正确连接并且正确设置了selectedValue属性)。
另一种方法是处理文本框或下拉列表本身的事件。您将再次关注控件的属性和生命周期。
ASP.Net Forms使用SmartUI模式和恕我直言,这是对这种模式的最大打击。
答案 2 :(得分:0)
好的,试试这个
protected void LinkButton1_Click(object sender, EventArgs e)
{
LinkButton lnkBtn = (LinkButton)sender;
GridViewRow row = (GridViewRow)lnkBtn.NamingContainer;
DropDownList ddl= (DropDownList)row.FindControl("DropDownList1");
TextBox1.Text = ddl.SelectedValue.ToString();
}