ASP.NET gridview - 如何将动态填充的下拉列表添加到动态绑定的gridview中

时间:2017-02-11 20:23:35

标签: c# asp.net gridview drop-down-menu dynamic-programming

我已经四处寻找关于我的问题的答案,但我没有找到任何结论。我想要以下内容: 我有一个带有GridView的asp.net表单,它不绑定到数据源,因此没有预定义的列。我使用SQL Server中的数据动态填充gridview:

gvComponentLocks.DataSource = getComponentsAndLocks(worksPermitID);
//Note getComponentsAndLocks encapsulates the database query and returns a DataTable
gvComponentLocks.DataBind();

现在我想在GridView的一个特定列中有一个DropDownList。这个DropDownList应该动态填充值(这里我认为...... Item.Add是合适的方法)。 我最大的问题是如何在单元格中创建DropDownLists而不能将它们静态地定义为asp:TemplateField在网页的标记中?

回答我的问题的另一种方法是如何使用来自数据源的数据动态填充静态定义的GridView(具有静态定义的DropDownList控件) - 而无需将GridView静态绑定到DataSource。

2 个答案:

答案 0 :(得分:0)

假设GridView(具有静态定义的DropDownList控件)

 <asp:DropDownList ID="DropDownList1" runat="server">
                                                </asp:DropDownList>

在旁边

  protected void gvComponentLocks_RowDataBound(object sender, GridViewRowEventArgs e)
   if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {

做类似的事情......

DropDownList DropDownList1 = (DropDownList)e.Row.FindControl("DropDownList1");
 DropDownList1.DataSource=SomeDropDownList1ItemCollection
 DropDownList1.Bind();

或者从ListItemCollection返回,最好是......

 gvComponentLocks.Items.AddRange(LoadList().Cast<ListItem>().ToArray());

,其中

public ListItemCollection LoadList()
            {

    ListItemCollection Items = new ListItemCollection();
                Items.Add(new ListItem("Choose from list...", ""));
                Items.Add(new ListItem("Text","Value")

动态DropDownList: 将PlaceHolder控件放在网格中的模板中。在后面的代码中使用适当的id创建一个DropDownList控件,并添加到PlaceHolder控件。

 DropDownList DropDownList1= new DropDownList();
DropDownList1.ID=... 
etc
YourPlaceHolderControl.Controls.Add(DropDownList1)

您必须在回发时构建这个动态DropDownList并重新填充它。

答案 1 :(得分:0)

您可以在GridView的RowDataBound事件中动态创建DropDownList。

protected void gvComponentLocks_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //check if the row is a datarow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //create a new dropdownlsit
        DropDownList ddl = new DropDownList();

        //bind the source and define the values
        ddl.DataSource = getComponentsAndLocks(worksPermitID);
        ddl.DataTextField = "columnA";
        ddl.DataValueField = "columnB";
        ddl.DataBind();

        //add the dropdownlist to the gridview in column 1
        e.Row.Cells[1].Controls.Add(ddl);
    }
}

您还必须做的唯一事情是将GridView的DataBBinding放在IsPostBack检查之外。否则你将在PostBack后失去DropDowns。