代码添加 GridView 模板列一种方法示例

动态添加列,关键是实现 ITemplate.InstantiateIn 方法。下面是一个添加 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>

你可能感兴趣的:(GridView)