/// <summary>确定创建Initor对象</summary> private void btOK_Click(object sender, EventArgs e) { if (dgvTypes.SelectedRows == null || dgvTypes.SelectedRows.Count == 0) { MessageBox.Show("请选择需要创建的设备类型"); return; } if (string.IsNullOrWhiteSpace(tbID.Text)) { MessageBox.Show("设备ID不能为空,请重新输入"); tbID.Focus(); return; } if (!_isFixedID && JFHubCenter.Instance.InitorManager.ContainID(tbID.Text)) { IJFInitializable dev = JFHubCenter.Instance.InitorManager.GetInitor(tbID.Text); string disTypeName = JFinitializerHelper.DispalyTypeName(dev.GetType()); MessageBox.Show(string.Format("Initor列表中已存在ID = \"{0}\" Type = \"{1}\"的设备\n请重新输入ID!", tbID.Text, disTypeName)); tbID.Focus(); return; } //IJFDevice newDev = JFHubCenter.Instance.InitorHelp.CreateInstance(dgvTypes.SelectedRows[0].Cells[0].Value.ToString()) as IJFDevice; //for (int i = 2; i < gbParams.Controls.Count;i++) for (int i = 0; i < panelParams.Controls.Count; i++) { //UcJFParamEdit pe = gbParams.Controls[i] as UcJFParamEdit; UcJFParamEdit pe = panelParams.Controls[i] as UcJFParamEdit; object paramVal = null; if (!pe.GetParamValue(out paramVal)) { MessageBox.Show("初始化参数:\"" + pe.Name + "\"获取失败!Error:" + pe.GetParamErrorInfo()); //newDev.Dispose(); pe.Focus(); return; } if (!initor.SetInitParamValue(initor.InitParamNames[i], paramVal)) { MessageBox.Show(string.Format("设置初始化参数失败:Name = {0},Value = {1}", initor.InitParamNames[i], paramVal.ToString())); //newDev.Dispose(); pe.Focus(); return; } } DialogResult = DialogResult.OK; }
bool isEditting; ///是否处于编辑初始化参数状态 /// <summary>编辑/保存 初始化参数</summary> private void btEditSave_Click(object sender, EventArgs e) { if (!isEditting)//参数未编辑状态 { if (dgvDevs.SelectedRows == null || 0 == dgvDevs.SelectedRows.Count) { MessageBox.Show("请选择需要编辑参数的对象"); return; } if (gbParams.Controls.Count <= 5) //没有初始化参数 { return; } for (int i = 5; i < gbParams.Controls.Count; i++) { UcJFParamEdit pe = gbParams.Controls[i] as UcJFParamEdit; pe.IsValueReadOnly = false; } dgvDevs.Enabled = false; btEditSave.Text = "保存"; btCancel.Enabled = true; btInit.Enabled = false; btAdd.Enabled = false; btRemove.Enabled = false; btDebug.Enabled = false; isEditting = true; } else //编辑完成,需要存储编辑后的参数 { IJFInitializable dev = JFHubCenter.Instance.InitorManager[dgvDevs.SelectedRows[0].Cells[0].Value.ToString()]; List <object> initParams = new List <object>(); initParams.Add(dev.GetType().AssemblyQualifiedName);//DevType for (int i = 5; i < gbParams.Controls.Count; i++) { object paramVal = null; UcJFParamEdit pe = gbParams.Controls[i] as UcJFParamEdit; if (!pe.GetParamValue(out paramVal)) { pe.Focus(); MessageBox.Show("参数\"" + dev.InitParamNames[i - 5] + "\"格式错误:" + pe.GetParamErrorInfo()); return; } if (!dev.SetInitParamValue(dev.InitParamNames[i - 5], paramVal)) { pe.Focus(); MessageBox.Show("设置参数\"" + dev.InitParamNames[i - 5] + "\"失败:" + dev.GetInitErrorInfo()); return; } //initParams.Add(paramVal); //替换为以下代码,适应数组/基类型混编的参数列表 //paramsInCfg.Add(dev.GetInitParamValue(dev.InitParamNames[i])); 本行代码用以下代码代替,以支持有限的 简单类型 + 数组(列表)类型的组合 //暂时的解决方法:将数组类型转化为字符串存储 Type paramType = dev.GetInitParamDescribe(dev.InitParamNames[i - 5]).ParamType; SerializableAttribute[] sas = paramType.GetCustomAttributes(typeof(SerializableAttribute), false) as SerializableAttribute[]; if (sas != null && sas.Length > 0) //如果是可序列化的类型,直接保存序列化后的文本 { StringBuilder buffer = new StringBuilder(); XmlSerializer serializer = new XmlSerializer(paramType); using (TextWriter writer = new StringWriter(buffer)) { serializer.Serialize(writer, paramVal); } string xmlTxt = buffer.ToString(); initParams.Add(xmlTxt); // paramsInCfg.Add(xmlTxt); } else { if (paramType.IsValueType || paramType == typeof(string)) //单值对象和字符串对象直接添加 { initParams.Add(paramVal); } else //目前支持Array 和 List { if (paramType.IsArray) //参数类型是数组 { if (null == paramVal) { initParams.Add(""); } else { StringBuilder sb = new StringBuilder(); string splitString = "$"; for (int j = 0; j < (paramVal as Array).Length; j++) { sb.Append((paramVal as Array).GetValue(j).ToString()); if (j < (paramVal as Array).Length - 1) { sb.Append(splitString); } } initParams.Add(sb.ToString());//paramsInCfg.Add(string.Join(splitString, paramVal)); //使用ASC 响铃符作为间隔 } } else if (typeof(IList).IsAssignableFrom(paramType)) //除了数组之外的队列类型 { if (null == paramVal) { initParams.Add(""); } else { StringBuilder sb = new StringBuilder(); string splitString = "$"; for (int j = 0; j < (paramVal as IList).Count; j++) { sb.Append((paramVal as IList)[j].ToString()); if (j < (paramVal as IList).Count - 1) { sb.Append(splitString); } } initParams.Add(sb.ToString()); //paramsInCfg.Add(string.Join(System.Text.Encoding.ASCII.GetString(new byte[] { 0x07 }), paramVal)); //使用ASC 响铃符作为间隔 } } } } } for (int i = 5; i < gbParams.Controls.Count; i++) { UcJFParamEdit pe = gbParams.Controls[i] as UcJFParamEdit; pe.IsValueReadOnly = true; } if (!dev.Initialize()) { MessageBox.Show("用当前参数初始化设备失败:" + dev.GetInitErrorInfo()); } JFXmlSortedDictionary <string, List <object> > devCfg = JFHubCenter.Instance.SystemCfg.GetItemValue(JFHubCenter.CK_InitDevParams) as JFXmlSortedDictionary <string, List <object> >; devCfg[dgvDevs.SelectedRows[0].Cells[0].Value.ToString()] = initParams; JFHubCenter.Instance.SystemCfg.NotifyItemChanged(JFHubCenter.CK_InitDevParams); JFHubCenter.Instance.SystemCfg.Save(); btInit.Enabled = true; btAdd.Enabled = true; btRemove.Enabled = true; //btDebug.Enabled = true; isEditting = false; btEditSave.Text = "编辑参数"; btCancel.Enabled = false; dgvDevs.Enabled = true; Type devType = dev.GetType(); if (typeof(IJFDevice_Camera).IsAssignableFrom(devType) || typeof(IJFDevice_LightController).IsAssignableFrom(devType) || typeof(IJFDevice_MotionDaq).IsAssignableFrom(devType) || typeof(IJFDevice_TrigController).IsAssignableFrom(devType) || typeof(IJFRealtimeUIProvider).IsAssignableFrom(devType)) //提供调试界面 { btDebug.Enabled = true; if (typeof(IJFRealtimeUIProvider).IsAssignableFrom(devType)) { chkSelfUI.Enabled = true; } else { chkSelfUI.Checked = false; chkSelfUI.Enabled = false; } } else { btDebug.Enabled = false; } if (typeof(IJFConfigUIProvider).IsAssignableFrom(devType)) { btCfg.Enabled = true; } else { btCfg.Enabled = false; } } }