0

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

提前致谢...

4

3 回答 3

0

我猜你应该使用数据绑定来实现 INotifyProperty 更改。这样,每个更改都将被记录,包括在下拉框中第一次更改后所做的更改。见 ~ http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

于 2014-07-02T21:44:44.733 回答
0

由于您正在动态创建和绑定 Dropdownlist,因此在执行 click 事件时它不会加载。要使用绑定属性(selectedValue本例中的属性),控件必须已经加载,并且它的视图状态信息由控件解析和设置。

创建下拉列表的数据绑定事件在预渲染之后运行。有关页面生命周期的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.85%29.aspx

要执行您的要求,需要非常密切关注页面生命周期。尝试将设置文本框的代码移至GridView1_RowDataBound方法。但是,要使其正常工作,您的控件必须每次都使用相同的属性呈现(这样事件就可以正确连接,并且 selectedValue 属性设置正确)。

另一种选择是处理文本框或下拉列表本身的事件。您将再次需要注意控件的属性和生命周期。

ASP.Net Forms 使用 SmartUI 模式,恕我直言,这是对这种模式的最大打击。

于 2014-07-02T22:10:27.850 回答
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();
}
于 2014-07-02T22:24:41.747 回答