zoukankan      html  css  js  c++  java
  • GridView中动态添加模板列和其子控件集合

    一、实施说明:

    1 实施原因:

    因为在做一个MOSS WebPart控件时候,遇到一个问题,如何选择需要导出的数据列;

    GridView的数据源是动态的,所以没有办法静态使用模板列,来选择导出的列;

    之所以没有用BoundField的原因,是因为一列数据列中不能放入两个或两个以上的控件,

    以及不能在表头加入相关控件。所以,最后,我采用动态添加模板列的方法解决这个问题,

    欢迎大家测试和改善。

    2、待改善问题:

    a、如何控制模板列中子控件集合的UI布局,

    b、HeaderTemplate区域不能对子控件进行数据绑定。

    如图所示:

    选择文件清单“Site_Menu”时候:

    选择文件清单“Web 部件库”时候

    二、代码结构

    类对象的使用关系:

    GridVeiw-->Column-->TemplateField-->Header/DataRow-->MyTemplateColumn-->ColumnField;

    其中MyTemplateField继承ITemplate;

    ControlField为MyTemplateField提供构造模板列的相关数据。

    三、代码内容

    1、MyTemplateColumn.cs,详情如下:

    MyTemplateColumn.cs
    1 using System;
    2 using System.Data;
    3 using System.Configuration;
    4 using System.Linq;
    5 using System.Web;
    6 using System.Web.Security;
    7 using System.Web.UI;
    8 using System.Web.UI.HtmlControls;
    9 using System.Web.UI.WebControls;
    10 using System.Web.UI.WebControls.WebParts;
    11 using System.Xml.Linq;
    12
    13 namespace Test.WebControls.GridView.MyTemplateColumn
    14 {
    15 public class MyTmeplateColumn:ITemplate
    16 {
    17 /// <summary>
    18 /// 委托
    19 /// </summary>
    20 /// <param name="sender"></param>
    21 /// <param name="e"></param>
    22 public delegate void EventHandler(object sender, EventArgs e);
    23 /// <summary>
    24 /// 事件
    25 /// </summary>
    26 public event EventHandler eh;
    27 /// <summary>
    28 /// 模板列的类型
    29 /// </summary>
    30 private DataControlRowType templateType;
    31
    32 /// <summary>
    33 /// 数据绑定列的标题
    34 /// </summary>
    35 private string HeaderText;
    36 /// <summary>
    37 /// 模板列控件对象的集合<控件ID, 控件对象>
    38 /// </summary>
    39 private System.Collections.Generic.Dictionary<string, ControlField> ControlsFieldList;
    40
    41 public MyTmeplateColumn(DataControlRowType type, string headerText)
    42 {
    43 this.templateType = type;
    44 this.HeaderText = headerText;
    45 }
    46
    47 public MyTmeplateColumn(DataControlRowType type, string headerText, System.Collections.Generic.Dictionary<string, ControlField> ControlsFieldList)
    48 {
    49 this.templateType = type;
    50 this.HeaderText = headerText;
    51 this.ControlsFieldList = ControlsFieldList;
    52 }
    53
    54 /// <summary>
    55 /// 进行数据绑定
    56 /// </summary>
    57 /// <param name="container"></param>
    58 public void InstantiateIn(System.Web.UI.Control container)
    59 {
    60 switch (templateType)
    61 {
    62 case DataControlRowType.Header:
    63 {
    64 if (this.ControlsFieldList != null && this.ControlsFieldList.Count > 0)
    65 {
    66 for (int i = 0; i < this.ControlsFieldList.Count; i++)
    67 {
    68 string ID = this.ControlsFieldList.Keys.ToArray()[i].ToString().Trim();
    69 ControlField controlField = this.ControlsFieldList[ID];
    70
    71 // 执行数据绑定
    72 System.Web.UI.Control control = controlField.UIControl;
    73 if (control != null && controlField != null)
    74 {
    75 //control.DataBinding += new System.EventHandler(ControlFieldDataBinding);
    76 container.Controls.Add(control);
    77 }
    78 }
    79 }
    80
    81 Literal lc = new Literal();
    82 lc.Text = this.HeaderText;
    83 container.Controls.Add(lc);
    84
    85 break;
    86 }
    87 case DataControlRowType.DataRow:
    88 {
    89
    90 if (this.ControlsFieldList != null && this.ControlsFieldList.Count > 0)
    91 {
    92 for (int i = 0; i < this.ControlsFieldList.Count; i++)
    93 {
    94 string ID = this.ControlsFieldList.Keys.ToArray()[i].ToString().Trim();
    95 ControlField controlField = this.ControlsFieldList[ID];
    96
    97 // 执行数据绑定
    98 System.Web.UI.Control control = controlField.UIControl;
    99 if (control != null && controlField != null)
    100 {
    101 control.DataBinding += new System.EventHandler(ControlFieldDataBinding);
    102 container.Controls.Add(control);
    103 }
    104 }
    105 }
    106 break;
    107 }
    108 default:
    109 {
    110 break;
    111 }
    112 }
    113 }
    114
    115 /// <summary>
    116 /// ControlField的对象进行数据绑定
    117 /// </summary>
    118 /// <param name="controlField"></param>
    119 public void ControlFieldDataBinding(object sender, EventArgs e)
    120 {
    121 GridViewRow container = null;
    122 ControlField controlField = null;
    123
    124 string control_type = sender.GetType().Name;
    125 string control_id = "";
    126 switch (control_type)
    127 {
    128 case "Label":
    129 {
    130 control_id = (sender as Label).ID.Trim();
    131 break;
    132 }
    133 case "TextBox":
    134 {
    135 control_id = (sender as TextBox).ID.Trim();
    136 break;
    137 }
    138 case "LinkButton":
    139 {
    140 control_id = (sender as LinkButton).ID.Trim();
    141 break;
    142 }
    143 case "Button":
    144 {
    145 control_id = (sender as Button).ID.Trim();
    146 break;
    147 }
    148 case "DropDownList":
    149 {
    150 control_id = (sender as DropDownList).ID.Trim();
    151 break;
    152 }
    153 case "CheckBox":
    154 {
    155 control_id = (sender as CheckBox).ID.Trim();
    156 break;
    157 }
    158 case "RadioButton":
    159 {
    160 control_id = (sender as RadioButton).ID.Trim();
    161 break;
    162 }
    163 }
    164 if (control_id != "")
    165 {
    166 controlField = this.ControlsFieldList[control_id];
    167 }
    168
    169
    170 if (controlField != null)
    171 {
    172 // 转化子控件
    173 System.Collections.Generic.Dictionary<string, string> fields = null;// <property, key> = <服务器控件属性名称, 属性绑定数据字段>
    174 string property = "";//服务器控件属性名称
    175 string key = "";//属性绑定数据字段
    176 string value = ""; //临时变量
    177 //
    178 switch (controlField.ControlType)
    179 {
    180 #region 按控件类别,进行数据绑定
    181 case ControlTypeEnum.Label:
    182 {
    183 #region Label DataBinding
    184 Label obj = controlField.UIControl as Label;
    185 container = obj.NamingContainer as GridViewRow;
    186
    187 if (obj != null && container != null)
    188 {
    189 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    190 {
    191 fields = controlField.Fields;
    192 for (int i = 0; i < fields.Count; i++)
    193 {
    194 property = fields.Keys.ToArray()[i];
    195 if (property != null && property.Trim() != "")
    196 {
    197 key = fields[property];
    198 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    199 switch (property.Trim().ToUpper())
    200 {
    201 case "TEXT":
    202 {
    203 obj.Text = value;
    204 break;
    205 }
    206 case "TOOLTIP":
    207 {
    208 obj.ToolTip = value;
    209 break;
    210 }
    211 case "ENABLED":
    212 {
    213 obj.Enabled = Convert.ToBoolean(value);
    214 break;
    215 }
    216 case "VISIBLE":
    217 {
    218 obj.Visible = Convert.ToBoolean(value);
    219 break;
    220 }
    221 }
    222 }
    223 }
    224 }
    225 }
    226 break;
    227 #endregion
    228 }
    229 case ControlTypeEnum.TextBox:
    230 {
    231 #region TextBox DataBinding
    232 TextBox obj = controlField.UIControl as TextBox; //sender as TextBox;
    233 container = obj.NamingContainer as GridViewRow;
    234
    235 if (obj != null && container != null)
    236 {
    237 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    238 {
    239 fields = controlField.Fields;
    240 for (int i = 0; i < fields.Count; i++)
    241 {
    242 property = fields.Keys.ToArray()[i];
    243 if (property != null && property.Trim() != "")
    244 {
    245 key = fields[property];
    246 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    247 switch (property.Trim().ToUpper())
    248 {
    249 case "TEXT":
    250 {
    251 obj.Text = value;
    252 break;
    253 }
    254 case "TOOLTIP":
    255 {
    256 obj.ToolTip = value;
    257 break;
    258 }
    259 case "ENABLED":
    260 {
    261 obj.Enabled = Convert.ToBoolean(value);
    262 break;
    263 }
    264 case "VISIBLE":
    265 {
    266 obj.Visible = Convert.ToBoolean(value);
    267 break;
    268 }
    269 }
    270 }
    271 }
    272 }
    273 }
    274 break;
    275 #endregion
    276 }
    277 case ControlTypeEnum.LinkButton:
    278 {
    279 #region LinkButton DataBinding
    280 LinkButton obj = controlField.UIControl as LinkButton;
    281 container = obj.NamingContainer as GridViewRow;
    282
    283 if (obj != null && container != null)
    284 {
    285 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    286 {
    287 fields = controlField.Fields;
    288 for (int i = 0; i < fields.Count; i++)
    289 {
    290 property = fields.Keys.ToArray()[i];
    291 if (property != null && property.Trim() != "")
    292 {
    293 key = fields[property];
    294 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    295 switch (property.Trim().ToUpper())
    296 {
    297 case "TEXT":
    298 {
    299 obj.Text = value;
    300 break;
    301 }
    302 case "TOOLTIP":
    303 {
    304 obj.ToolTip = value;
    305 break;
    306 }
    307 case "ENABLED":
    308 {
    309 obj.Enabled = Convert.ToBoolean(value);
    310 break;
    311 }
    312 case "VISIBLE":
    313 {
    314 obj.Visible = Convert.ToBoolean(value);
    315 break;
    316 }
    317 case "POSTBACKURL":
    318 {
    319 obj.PostBackUrl = value;
    320 break;
    321 }
    322 }
    323 }
    324 }
    325 }
    326 }
    327 break;
    328 #endregion
    329 }
    330 case ControlTypeEnum.Button:
    331 {
    332 #region Button DataBinding
    333 Button obj = controlField.UIControl as Button;
    334 container = obj.NamingContainer as GridViewRow;
    335
    336 if (obj != null && container != null)
    337 {
    338 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    339 {
    340 fields = controlField.Fields;
    341 for (int i = 0; i < fields.Count; i++)
    342 {
    343 property = fields.Keys.ToArray()[i];
    344 if (property != null && property.Trim() != "")
    345 {
    346 key = fields[property];
    347 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    348 switch (property.Trim().ToUpper())
    349 {
    350 case "TEXT":
    351 {
    352 obj.Text = value;
    353 break;
    354 }
    355 case "TOOLTIP":
    356 {
    357 obj.ToolTip = value;
    358 break;
    359 }
    360 case "ENABLED":
    361 {
    362 obj.Enabled = Convert.ToBoolean(value);
    363 break;
    364 }
    365 case "VISIBLE":
    366 {
    367 obj.Visible = Convert.ToBoolean(value);
    368 break;
    369 }
    370 case "POSTBACKURL":
    371 {
    372 obj.PostBackUrl = value;
    373 break;
    374 }
    375 }
    376 }
    377 }
    378 }
    379 }
    380 break;
    381 #endregion\
    382 }
    383 case ControlTypeEnum.DropDownList:
    384 {
    385
    386 break;
    387 }
    388 case ControlTypeEnum.CheckBox:
    389 {
    390 #region CheckBox DataBinding
    391 CheckBox obj = controlField.UIControl as CheckBox;
    392 container = obj.NamingContainer as GridViewRow;
    393
    394 if (obj != null && container != null)
    395 {
    396 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    397 {
    398 fields = controlField.Fields;
    399 for (int i = 0; i < fields.Count; i++)
    400 {
    401 property = fields.Keys.ToArray()[i];
    402 if (property != null && property.Trim() != "")
    403 {
    404 key = fields[property];
    405 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    406 switch (property.Trim().ToUpper())
    407 {
    408 case "TEXT":
    409 {
    410 obj.Text = value;
    411 break;
    412 }
    413 case "TOOLTIP":
    414 {
    415 obj.ToolTip = value;
    416 break;
    417 }
    418 case "ENABLED":
    419 {
    420 obj.Enabled = Convert.ToBoolean(value);
    421 break;
    422 }
    423 case "VISIBLE":
    424 {
    425 obj.Visible = Convert.ToBoolean(value);
    426 break;
    427 }
    428 case "CHECKED":
    429 {
    430 obj.Checked = Convert.ToBoolean(value);
    431 break;
    432 }
    433 }
    434 }
    435 }
    436 }
    437 }
    438 break;
    439 #endregion
    440 }
    441 case ControlTypeEnum.RadioButton:
    442 {
    443 #region RadioButton DataBinding
    444 RadioButton obj = controlField.UIControl as RadioButton;
    445 container = obj.NamingContainer as GridViewRow;
    446
    447 if (obj != null && container != null)
    448 {
    449 if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
    450 {
    451 fields = controlField.Fields;
    452 for (int i = 0; i < fields.Count; i++)
    453 {
    454 property = fields.Keys.ToArray()[i];
    455 if (property != null && property.Trim() != "")
    456 {
    457 key = fields[property];
    458 value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
    459 switch (property.Trim().ToUpper())
    460 {
    461 case "TEXT":
    462 {
    463 obj.Text = value;
    464 break;
    465 }
    466 case "TOOLTIP":
    467 {
    468 obj.ToolTip = value;
    469 break;
    470 }
    471 case "ENABLED":
    472 {
    473 obj.Enabled = Convert.ToBoolean(value);
    474 break;
    475 }
    476 case "VISIBLE":
    477 {
    478 obj.Visible = Convert.ToBoolean(value);
    479 break;
    480 }
    481 case "CHECKED":
    482 {
    483 obj.Checked = Convert.ToBoolean(value);
    484 break;
    485 }
    486 }
    487 }
    488 }
    489 }
    490 }
    491 break;
    492 #endregion
    493 }
    494 #endregion
    495 }
    496 }
    497
    498 }
    499
    500 }
    501 }
    502

    2、ControlField.cs代码详情:

    ControlField.cs代码详情
    1 using System;
    2 using System.Data;
    3 using System.Configuration;
    4 using System.Linq;
    5 using System.Web;
    6 using System.Web.Security;
    7 using System.Web.UI;
    8 using System.Web.UI.HtmlControls;
    9 using System.Web.UI.WebControls;
    10 using System.Web.UI.WebControls.WebParts;
    11 using System.Xml.Linq;
    12
    13 namespace Test.WebControls.GridView.MyTemplateColumn
    14 {
    15 /// <summary>
    16 /// 控件类型
    17 /// </summary>
    18 public enum ControlTypeEnum
    19 {
    20 Label,
    21
    22 TextBox,
    23
    24 LinkButton,
    25
    26 DropDownList,
    27
    28 Button,
    29
    30 CheckBox,
    31
    32 RadioButton
    33 }
    34
    35 /// <summary>
    36 ///
    37 /// </summary>
    38 public class ControlField
    39 {
    40 /// <summary>
    41 /// 服务器控件类型
    42 /// </summary>
    43 public ControlTypeEnum ControlType
    44 {
    45 get;
    46 set;
    47 }
    48
    49 /// <summary>
    50 /// 服务器控件对象
    51 /// </summary>
    52 public System.Web.UI.Control UIControl
    53 {
    54 get;
    55 set;
    56 }
    57
    58 /// <summary>
    59 /// <服务器控件属性名称, 属性绑定数据字段>
    60 /// </summary>
    61 public System.Collections.Generic.Dictionary<string, string> Fields
    62 {
    63 get;
    64 set;
    65 }
    66
    67 public ControlField(ControlTypeEnum controlType, System.Web.UI.Control control, System.Collections.Generic.Dictionary<string, string> fileds)
    68 {
    69 this.ControlType = controlType;
    70 this.UIControl = control;
    71 this.Fields = fileds;
    72 }
    73 }
    74 }
    75

    3、 动态添加模板列的代码

    动态添加模板列的代码
    1 using System;
    2 using System.Collections;
    3 using System.Configuration;
    4 using System.Data;
    5 using System.Linq;
    6 using System.Web;
    7 using System.Web.Security;
    8 using System.Web.UI;
    9 using System.Web.UI.HtmlControls;
    10 using System.Web.UI.WebControls;
    11 using System.Web.UI.WebControls.WebParts;
    12 using System.Xml.Linq;
    13
    14 namespace Test.WebControls.GridView.MyTemplateColumn
    15 {
    16 public partial class test01 : System.Web.UI.Page
    17 {
    18 protected override void OnInit(EventArgs e)
    19 {
    20 this.GeneralCols();
    21 base.OnInit(e);
    22 }
    23
    24 protected void Page_Load(object sender, EventArgs e)
    25 {
    26 if (!IsPostBack)
    27 {
    28 this.Bind();
    29 }
    30 }
    31
    32 private void GeneralCols()
    33 {
    34 // 第1个模板列: Label
    35 // HeaderTemplate Row
    36 System.Collections.Generic.Dictionary<string, ControlField> controlFieldList1 = new System.Collections.Generic.Dictionary<string, ControlField>();
    37 TemplateField col1 = new TemplateField();
    38 col1.ShowHeader = true;
    39 // CheckBox
    40 System.Web.UI.WebControls.CheckBox chk = new CheckBox();
    41 chk.ID = "chk";
    42 //
    43 System.Collections.Generic.Dictionary<string, string> fields0 = new System.Collections.Generic.Dictionary<string, string>();
    44 fields0.Add("Checked", "isYes");
    45 //
    46 ControlField controlField0 = new ControlField(ControlTypeEnum.CheckBox, chk, fields0);
    47 controlFieldList1.Add(chk.ID, controlField0);
    48 //
    49 MyTmeplateColumn col1_headerow = new MyTmeplateColumn(DataControlRowType.Header, "学生编号", controlFieldList1);
    50 col1.HeaderTemplate = col1_headerow;
    51
    52 // ItemTemplate Row
    53 System.Collections.Generic.Dictionary<string, ControlField> controlFieldList2 = new System.Collections.Generic.Dictionary<string, ControlField>();
    54 //
    55 System.Web.UI.WebControls.Label lblID = new Label();
    56 lblID.ID = "lblID";
    57 //
    58 System.Collections.Generic.Dictionary<string, string> fields2 = new System.Collections.Generic.Dictionary<string, string>();
    59 fields2.Add("Text", "ID");
    60 //
    61 ControlField controlField1 = new ControlField(ControlTypeEnum.Label, lblID, fields2);
    62 controlFieldList2.Add(lblID.ID, controlField1);
    63 //
    64 // TextBox
    65 System.Web.UI.WebControls.TextBox txtName = new TextBox();
    66 txtName.ID = "txtName";
    67 //
    68 System.Collections.Generic.Dictionary<string, string> fields3 = new System.Collections.Generic.Dictionary<string, string>();
    69 fields3.Add("Text", "Name");
    70 //
    71 ControlField controlField2 = new ControlField(ControlTypeEnum.TextBox, txtName, fields3);
    72 controlFieldList2.Add(txtName.ID, controlField2);
    73 //
    74 MyTmeplateColumn col1_itemrow = new MyTmeplateColumn(DataControlRowType.DataRow, "学生编号", controlFieldList2);
    75 col1.ItemTemplate = col1_itemrow;
    76
    77 gvShow.Columns.Add(col1);
    78
    79 }
    80
    81 public void lbtn_Click(object sender, EventArgs e)
    82 {
    83 ClientScript.RegisterStartupScript(GetType(), "test", "alert('ok');", true);
    84 }
    85
    86
    87 private void Bind()
    88 {
    89 DataTable dt = new DataTable();
    90 dt.Columns.Add("id", typeof(string));
    91 dt.Columns.Add("name", typeof(string));
    92 dt.Columns.Add("isyes", typeof(bool));
    93 dt.Columns.Add("url", typeof(string));
    94 DataRow dr = dt.NewRow();
    95 dr[0] = "No123456";
    96 dr[1] = "王晓巍";
    97 dr[2] = true;
    98 dr[3] = "http://www.baidu.com";
    99 dt.Rows.Add(dr);
    100 //
    101 gvShow.AutoGenerateColumns = false;
    102 gvShow.HeaderStyle.BackColor = System.Drawing.Color.BlueViolet;
    103 gvShow.HeaderStyle.ForeColor = System.Drawing.Color.FromName("#FFFFFF");
    104 gvShow.HeaderStyle.Font.Name = "华文行楷";
    105 gvShow.HeaderStyle.Font.Bold = true;
    106 gvShow.RowStyle.BackColor = System.Drawing.Color.ForestGreen;
    107 gvShow.GridLines = GridLines.Both;
    108 gvShow.CellPadding = 3;
    109 gvShow.CellSpacing = 0;
    110 gvShow.DataSource = dt;
    111 gvShow.DataBind();
    112 }
    113
    114 protected void btn_Click(object sender, EventArgs e)
    115 {
    116 Button btn = sender as Button;
    117 if (btn != null)
    118 {
    119 string s = string.Format("刚才你单击控件{0}: btn.Text={1}",btn.ID, btn.Text);
    120 ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + s + "')", true);
    121 }
    122 }
    123 }
    124 }
    125

    4、动态添加模板列的效果图:

  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/itshare/p/1871038.html
Copyright © 2011-2022 走看看