【问题标题】:How to get selected item from Dropdown in GridView?如何从 GridView 的下拉列表中获取选定的项目?
【发布时间】:2014-07-02 21:10:43
【问题描述】:

我有一个 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();
    }

提前谢谢...

【问题讨论】:

  • “第一项”是指在GridView1_RowDataBound 中动态绑定到ddl 的列表中的第一项吗?还是您在代码中某处为下拉菜单设置了默认的第一项?
  • 不,这是完整的代码,我已经...

标签: c# gridview dropdownbox rowdatabound


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      好的,试试这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多