如何从GridView中的Dropdown获取所选项目?

时间:2014-07-02 21:10:44

标签: c# gridview dropdownbox rowdatabound

我有一个GridView。每当我在选择下拉值后点击LinkBut​​ton时,我只会获得下拉菜单中的第一项。 我需要在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();
    }

提前致谢...

3 个答案:

答案 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();
}