流程平台:子表控件(三) - 数据操作
本文主要对子表控件的4个事件进行描述 (子表控件名称为SubTable)
oneditorinitializing="SubTable_EditorInitializing" oneditorloading="SubTable_EditorLoading" oneditorsaving="SubTable_EditorSaving"
onrowdatabound="SubTable_RowDataBound"
在默认情况下,子表控件的字段使用的都是文本框控件为输入控件,在很多时候我们可能需要换成下拉列表框、复选框、单选框,或者其他控件,如何实现?
下面介绍三种控件替换方式:下拉列表框、复选框、单选框。在进行控件替换时,
SubTable_EditorInitializing,SubTable_EditorLoading,SubTable_EditorSaving 需要在这三个事件中写代码实现,
比如子表控件中有个“OS”字段,表示“操作系统”,需要做成DropDownList下拉列表框控件,从中选择一项;
“AntiVirus”字段,表示“是否要安装杀毒软件”,需要做成CheckBox复选框控件,选中或不选中;
“PatchUpdate”字段,表示“是否要打补丁更新”,需要做成具有“是”和“否”的RadioButtonList单选列表按钮;
为满足上述三个要求,那么在 SubTable_EditorInitializing 事件中可以这么写,该事件在表单页面打开时会触发,把默认的文本框控件替换为你想要的控件,并赋相应的值。
//e.ColumnName为子表字段名称,区分大小写 switch (e.ColumnName) { case "OS"://“操作系统”字段需要用下拉列表框 //定义下拉列表框 DropDownList control_list = new DropDownList(); control_list.Items.Add(new ListItem("请选择操作系统", "0")); control_list.Items.Add(new ListItem("Windows2003", "1")); control_list.Items.Add(new ListItem("Windows2008", "2")); control_list.Items.Add(new ListItem("Linux", "3")); control_list.SelectedIndex = 0; control_list.Width = 153; control_list.ID = "subtable_ddl_os"; //默认控件替换为下拉列表框 e.Control = control_list;//关键这句,进行可控件替换 break; case "AntiVirus"://“是否安装杀毒软件”字段需要用复选框替换 CheckBox control_check = new CheckBox(); control_check.ID = "subtable_chk_antivirus"; e.Control = control_check; break; case "PatchUpdate"://“是否要打补丁更新”字段需要用单选列表替换 RadioButtonList control_patchupdate = new RadioButtonList(); control_patchupdate.Items.Add(new ListItem("是", "1")); control_patchupdate.Items.Add(new ListItem("否", "0")); control_patchupdate.RepeatDirection = RepeatDirection.Horizontal; control_patchupdate.SelectedValue = "0"; control_patchupdate.ID = "subtabe_rbl_patchupdate"; e.Control = control_patchupdate;//这句必须的 break; }
当用户填充完子表控件数据后,点击“添加”按钮后,会触发子表的 SubTable_EditorSaving 事件,在这事件中,我们需要把上面几个被替换掉的控件中的值填会到子表相应的字段中去,
//e.ColumnName为子表字段名称 switch (e.ColumnName) { case "OS"://获取DropDownList下拉列表框的值,填充到子表字段“OS” DropDownList control_os = (DropDownList)e.Control; e.Get = true; e.Value = control_os.SelectedItem.Text;//给字段赋值:选中项的文本 //e.Value = control_os.SelectedItem.Value;//选中项的值 break; case "AntiVirus"://获取CheckBox复选框控件的值,填充到子表字段“AntiVirus” CheckBox control_antivirus = (CheckBox)e.Control; e.Get = true; e.Value = control_antivirus.Checked ? "1" : "0";//给字段赋值 break; case "PatchUpdate"://获取RadioButtonList复选框控件的值,填充到子表字段“PatchUpdate” RadioButtonList control_patchupdate = (RadioButtonList)e.Control; e.Get = true; e.Value = control_patchupdate.SelectedValue == "1" ? "1" : "0";//给字段赋值 break; }
同时,在 事件中还能做子表字段输入值的校验工作,如:DiskTotal,表示“磁盘总容量”,输入值必须是大于1的整数(不能为空,不能小于1),则校验代码如下:
//该代码在上述Switch...case中
case "DiskTotal"://校验子表字段输入的合法性:不为空,且 >0 TextBox txt_disktotal = (TextBox)e.Control; if (string.IsNullOrEmpty(txt_disktotal.Text)) { e.ErrorMessage = " * 磁盘总容量不能为空!"; e.Valid = false; SZTelecom.FCommon.Msg_Alert(this, e.ErrorMessage); } int i_disk = 0; if (!int.TryParse(txt_disktotal.Text, out i_disk) || i_disk < 1) { e.ErrorMessage = " * 磁盘总容量必须大于1G!"; e.Valid = false; SZTelecom.FCommon.Msg_Alert(this, e.ErrorMessage); } e.Get = true; e.Value = txt_disktotal.Text; break;
在完成上述两个事件后,子表数据被添加进去,子表控件上部就会出现一个表格,表格中的数据就是我们刚添加的,然后当我们需要对其中某条数据进行修改更新时,点击记录左侧的“选中”按钮,该按钮会触发 SubTable_EditorLoading 事件,这是我们还需要把子表中存的真实数据还原到子表控件被替换的控件中去,比如“OS”存的是“Windows2003”,那么我们就需要自动去把“OS”对应的DropDownList下拉列表框中该项选中,同理“AntiVirus”的实际值是1的话,就需要自动选中CheckBox复选状态,“PatchUpdate”的实际值是1的话自动选中RadioButtonList中的“是”,为0时自动选中RadioButtonList中的“否”,代码如下:
//e.ColumnName为子表字段名称,区分大小写 switch (e.ColumnName) { case "OS"://把“操作系统”字段的值转换为控件的选中项 DropDownList control_os = (DropDownList)this.SubTable.GetEditControl("OS"); control_os.SelectedIndex = control_os.Items.IndexOf(control_os.Items.FindByText((string)e.Value));//e.Value存的是文本 //control_os.SelectedIndex = control_os.Items.IndexOf(control_os.Items.FindByValue((string)e.Value));//e.Value存的是值 e.Set = true;//这句是关键 break; case "AntiVirus"://“是否装杀毒软件”字段的值转换为控件的选中状态 CheckBox control_antivirus = (CheckBox)this.SubTable.GetEditControl("AntiVirus"); if (e.Value.ToString() == "1") { control_antivirus.Checked = true; } e.Set = true; break; case "PatchUpdate"://获取RadioButtonList复选框控件的值,填充到子表字段“PatchUpdate” RadioButtonList control_patchupdate = (RadioButtonList)e.Control; control_patchupdate.SelectedIndex = control_patchupdate.Items.IndexOf(control_patchupdate.Items.FindByValue((string)e.Value)); e.Set = true; break; }
上述三个事件就完成了子表控件中字段输入控件的替换、保存、加载功能,那么再来看子表控件的表格数据,其中“PatchUpdate”显示的是1和0,这种值可读性差,我们需要转换为枚举型,比如1=是,0=否,
这是我们需要在子表的 SubTable_RowDataBound 事件中写代码实现,如下:
//数据行才开始处理 if (e.Row.RowType == DataControlRowType.DataRow)//数据行 { //找到“PatchUpdate”在GridView表格中的位置 int i_index = SubTable.GetColumnIndex("PatchUpdate"); if (i_index > -1) { //更改该单元格内容的值 e.Row.Cells[i_index].Text = e.Row.Cells[i_index].Text == "1" ? "是" : "否"; } }
备注:在子表控件的 SubTable_EditorInitializing 事件中,我们给替换的控件赋了个ID值,control_list.ID = "subtable_ddl_os";这是为子表控件使用js脚本处理时方便使用的,js(jquery)就可以通过$("subtable_ddl_os")方式找到该控件,进行相应的处理。