谁能给我一个动态生成gridview模板列并绑定一个dropdownlist控件的例子?
要求全部用aspx.cs后台代码实现,模板列和dropdownlist均为动态生成。

解决方案 »

  1.   

    其实也没什么。
    比如Northwind表的Products表里不是有个CategoryID字段吗?
    如果你想把这个字段显示成绑定了Categories表的DropDownList(显示的是CategoryName, Value是CategoryID)的话,关键是:<asp:TemplateField>
    <ItemTemplate>
     <asp:DropDownList ID="ddlCategories" SqlDataSourceID="sqldsCategories" DataTextField="CategoryName" DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %'> />
     <asp:SqlDataSource ID="sqldsCategories" SelectCommand="select CategoryID, CategoryName from Categories" ConnectionString="...." />
    </ItemTemplate>
    </asp:TemplateField>
      

  2.   

    其实也没什么。
    比如Northwind表的Products表里不是有个CategoryID字段吗?
    如果你想把这个字段显示成绑定了Categories表的DropDownList(显示的是CategoryName, Value是CategoryID)的话,关键是:<asp:TemplateField>
    <ItemTemplate>
     <asp:DropDownList ID="ddlCategories" SqlDataSourceID="sqldsCategories" DataTextField="CategoryName" DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %'> />
     <asp:SqlDataSource ID="sqldsCategories" SelectCommand="select CategoryID, CategoryName from Categories" ConnectionString="...." />
    </ItemTemplate>
    </asp:TemplateField>
      

  3.   

    楼上的解答是在aspx文件中写的吧,
    我的意思是,在后台代码文件(aspx.cs)中实现,把实现的方法写在一个函数中,
    类似这个:void CreateColDDl()
    {
    //在这个函数中写动态生成模板列,动态生成dropdownlist的语句
    }
      

  4.   

    就是说:页面上本来只有gridview,在page_load事件中写生成模板列和dropdownlist的操作
      

  5.   

    没这么试过
    为什么不在页面中加呢
    这样动态生成容易产生问题,动态生成dropdownlist都可能不能进行选择,要保存
      

  6.   

    写在page_load里面好像可以
    不过一开始就加载,为何不直接在页面中加啊
      

  7.   

    TemplateField tf = new TemplateField();
    tf.ShowHeader = true;...
    ...自己查查msdn.例子手里没有现成的..反正就是那几个类.
      

  8.   

    其实这个不难的呀,动态的生成Gridview
    给点参考代码段吧
    C#代码<%...@ Page Language="C#" %>
    <%...@ Import Namespace="System.Data" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">...
      ICollection CreateDataSource()
      ...{
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("id", typeof(Int32)));
        dt.Columns.Add(new DataColumn("text", typeof(string)));
        for (int i = 0; i < 6; i++)
        ...{
          dr = dt.NewRow();
          dr[0] = i;
          dr[1] = "列表项目 " + i.ToString();
          dt.Rows.Add(dr);
        }
        DataView dv = new DataView(dt);
        return dv;
      }  public class GridViewTemplate : ITemplate
      ...{
        private DataControlRowType templateType;
        private string columnName;    public GridViewTemplate( DataControlRowType type, string colname )
        ...{
          templateType = type;
          columnName = colname;
        }    public void InstantiateIn( System.Web.UI.Control container )
        ...{
          switch (templateType)
          ...{
            case DataControlRowType.Header:
              Literal lc = new Literal();
              lc.Text = columnName;          
              container.Controls.Add(lc);          
              break;
            case DataControlRowType.DataRow:
              DropDownList drr = new DropDownList();
              drr.ID = "dropdown";
              drr.AppendDataBoundItems = true;
              drr.Items.Add(new ListItem("-----请选择------",""));
              drr.Items.Add(new ListItem("AA", "a"));
              drr.Items.Add(new ListItem("BB", "b"));
              drr.Items.Add(new ListItem("CC", "c"));
              container.Controls.Add(drr);
              break;
            default:
             break;
          }
        }
      }
      
      protected void Page_Load(object sender, EventArgs e)
      ...{
        if (!IsPostBack)
        ...{
          TemplateField customField = new TemplateField();
          customField.ShowHeader = true;
          customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列");
          customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "");
          GridView1.Columns.Add(customField);
          GridView1.DataSource = CreateDataSource();
          GridView1.DataBind();
        }
      }  protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
      ...{
        if (e.Row.RowType == DataControlRowType.DataRow)
        ...{
          //可以在这里访问数据库的其它字段的值,可以设置默认选择项,具体应用,看自己的发挥了。
          //下面只是例子,举一反三,不再费话了
          DataRowView gv = (DataRowView)e.Row.DataItem;
          int itemSeleted = Int32.Parse(gv.Row["id"].ToString()) > 3 ? 0 : Int32.Parse(gv.Row["id"].ToString());
          DropDownList dr = (DropDownList)e.Row.FindControl("dropdown");
          dr.SelectedIndex = itemSeleted;
        }
      }
    </script><html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
      <title>GridView动态添加模板列的例子</title>
    </head>
    <body>
    <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
         OnRowDataBound="GridView1_RowDataBound">
        <Columns>
          <asp:BoundField HeaderText="标题"  DataField="text"/>
        </Columns>
      </asp:GridView> 
    </form>
    </body>
    </html>
      

  9.   

    动态生成模版列之后状态很难维持,一个回发就over了
      

  10.   

    楼上各位的意思我明白:比如页面:default.aspx
    后台文件:default.aspx.cs假若在default.aspx里面写代码,而不是在default.aspx.cs中写,
    那么这个gridview就是固定格式的了,而我现在需要根据操作员的级别,在gridview中显示不同的列,
    这样的话,就只能在后台文件中写了,该怎么实现呢?
      

  11.   

    同意。
    这样动态加载进GridView里的东西,只要页面上另外有个触发PostBack的控件,如按钮,AutoPostBack=true的DropDownList等,只要它们触发PostBack,那么动态加载的东西会不见的。所以一般这种情况至少得把GridView的EnableViewState设为false.
      

  12.   

    也许可以在GridView的DataBound事件里根据权限GridView1.Columns[Column_Index].Visible=false;
      

  13.   

    to namhyuk:PostBack的事情可以这样解决:  protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ///在这里写动态生成的代码
                this.CreateGrdv();
                this.bindtogridview();          
            }        
        }
      

  14.   

    状态很难维持的问题其实很好解决,只不过复杂一点罢了
    关键的问题是:在Page_Init 中生成GridView的模板列!一个例子:
    前台<form id="form1" runat="server">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <EmptyDataTemplate>
                    <asp:Label ID="Label1" runat="server" Text="没有数据!"></asp:Label>
                </EmptyDataTemplate>
            </asp:GridView>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </form>后台 protected void Page_Init(object sender, EventArgs e)
        {
            Dictionary<string, string> columnsInfo = new Dictionary<string, string>();
            columnsInfo.Add("Number", "编号");
            columnsInfo.Add("Code", "编码");
            columnsInfo.Add("Name", "名称");        foreach (string nameKey in columnsInfo.Keys)
            {
                TemplateField customTemp = new TemplateField();
                customTemp.HeaderText = columnsInfo[nameKey];
                GridViewCustomColumns gcc = new GridViewCustomColumns(nameKey);
                customTemp.ItemTemplate = gcc;
                GridView1.Columns.Add(customTemp);
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {        if (!Page.IsPostBack)
            {
                int id = 0;
                Dictionary<string, string> data = new Dictionary<string, string>();
                data.Add("D0001", "公司1");
                data.Add("D0002", "公司2");
                data.Add("D0003", "公司3");
                data.Add("D0004", "公司4");
                DataTable Dt = new DataTable();
                DataRow dr;
                Dt.Columns.Add("Number", typeof(string));
                Dt.Columns.Add("Code", typeof(string));
                Dt.Columns.Add("Name", typeof(string));            foreach (string skey in data.Keys)
                {
                    dr = Dt.NewRow();
                    dr[0] = id.ToString();
                    dr[1] = skey;
                    dr[2] = data[skey];
                    Dt.Rows.Add(dr);
                    id++;
                }
                this.GridView1.DataSource = Dt;
                this.GridView1.DataBind();
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {    }
    类GridViewCustomColumns
    public class GridViewCustomColumns : ITemplate
    {
        string s_ColumnsName;
        public GridViewCustomColumns(string strName)
        {
            s_ColumnsName = strName;
        }    void ITemplate.InstantiateIn(Control container)
        {
            Label lableName = new Label();
            lableName.ID = s_ColumnsName;
            lableName.DataBinding += new EventHandler(lableName_DataBinding);
            container.Controls.Add(lableName);
        }
        void lableName_DataBinding(object sender, EventArgs e)
        {
            Label lable = (Label)sender;
            GridViewRow container = (GridViewRow)lable.NamingContainer;
            DataRowView dl = (DataRowView)container.DataItem;
            lable.Text = dl[lable.ID].ToString();    }
    }
      

  15.   

    想显示几个列 就在Page_Init中 定义几个了
    确保columnsInfo.Add("Number", "编号");
    中的key 和数据源中 
    Dt.Columns.Add("Number", typeof(string));
    的列名一致就行了;
    看家代码,楼主要多给分啊,呵呵
      

  16.   

    要的就是 if (!IsPostBack)
                {
                    GridView();
                }
      

  17.   

    我也在找这个 兄弟 我现在自己写生成了 gridview 就缺这个dropdownlist了