百摩网
当前位置: 首页 生活百科

winform下拉框控件(讲解winform下拉框绑定数据)

时间:2023-05-25 作者: 小编 阅读量: 2 栏目名: 生活百科

在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示、编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随笔介绍如何快速实现主从表编辑界面的处理,结合GridControl控件的GridView控件对象,实现数据在列表中的实时编辑,非常方便。上面界面包括了主表信息,以及从表的信息两部分,这样填写后统一进行提交处理。其中初始化GridView的代码如下所示。

在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示、编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随笔介绍如何快速实现主从表编辑界面的处理,结合GridControl控件的GridView控件对象,实现数据在列表中的实时编辑,非常方便。

一、主从表的界面设计及展示

主从表一般涉及两个以上的表,一个是主表,其他的是从表的,在实际情况下,一般包含两个表较多,我们这里以两个表的主从表关系进行分析处理。

例如我们建立两个报销申请单表关系如下所示。

对于报销的主从表信息,我们可以在列表中进行展示,如下界面所示,分为两部分:一部分是主表信息,一部分是从表信息,单击主表信息后,显示对应从表的列表信息。

那么我们新增一条主表记录的时候,那么可以弹出一个新的界面进行数据的维护处理,方便我们录入主从表的信息,界面如下所示。

上面界面包括了主表信息,以及从表的信息(在GridView中实时录入)两部分,这样填写后统一进行提交处理。

二、主从表编辑界面的处理

这里主要介绍一下主从表的编辑界面处理,也就是上面这个界面的实现处理。

其中初始化GridView的代码如下所示。

/// <summary>/// 初始化明细表的GridView数据显示/// </summary>private void InitDetailGrid(){//初始清空列this.gridView1.Columns.Clear();//设置部分列隐藏this.gridView1.CreateColumn("ID", "编号").Visible = false;this.gridView1.CreateColumn("Header_ID", "主表编号").Visible = false;this.gridView1.CreateColumn("Apply_ID", "申请单编号").Visible = false;//添加下拉列表列,并绑定数据源this.gridView1.CreateColumn("FeeType", "费用类型", 100).CreateComboBox().BindDictItems("费用类型");//创建日期列并指定格式var OccurTime = this.gridView1.CreateColumn("OccurTime", "发生时间", 120).CreateDateEdit();OccurTime.EditMask = "yyyy-MM-dd HH:mm";OccurTime.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm";//创建数值列this.gridView1.CreateColumn("FeeAmount", "费用金额").CreateSpinEdit();//创建备注列this.gridView1.CreateColumn("FeeDescription", "费用说明", 200).CreateMemoEdit();//初始化GridView,可以新增列this.gridView1.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, ");//转义列内容显示this.gridView1.CustomColumnDisplayText += new CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText);//处理单元格的样式this.gridView1.RowCellStyle += new RowCellStyleEventHandler(gridView1_RowCellStyle);//不允许头部排序this.gridView1.OptionsCustomization.AllowSort = false;//绘制序号this.gridView1.CustomDrawRowIndicator += (s, e) =>{if (e.Info.IsRowIndicator && e.RowHandle >= 0){e.Info.DisplayText = (e.RowHandle + 1).ToString();}};//对输入单元格进行非空校验this.gridView1.ValidateRow += delegate(object sender, ValidateRowEventArgs e){var result = gridControl1.ValidateRowNull(e, new string[]{"FeeType"});};//新增行的内容初始化this.gridView1.InitNewRow += (s, e) =>{gridView1.SetRowCellValue(e.RowHandle, "ID", Guid.NewGuid().ToString());gridView1.SetRowCellValue(e.RowHandle, "Header_ID", tempInfo.ID);gridView1.SetRowCellValue(e.RowHandle, "Apply_ID", tempInfo.Apply_ID);gridView1.SetRowCellValue(e.RowHandle, "OccurTime", DateTime.Now);};}void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e){GridView gridView = this.gridView1;if (e.Column.FieldName == "FeeAmount"){e.Appearance.BackColor = Color.Green;e.Appearance.BackColor2 = Color.LightCyan;}}void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e){string columnName = e.Column.FieldName;if (e.Column.ColumnType == typeof(DateTime)){if (e.Value != null){if (e.Value == DBNull.Value || Convert.ToDateTime(e.Value) <= Convert.ToDateTime("1900-1-1")){e.DisplayText = ";}else{e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm");//yyyy-MM-dd}}}}

上面代码都有详细的备注,主要就是我们根据数据库表的关系,创建对应显示的字段即可,其中有需要隐藏的那么就不要显示(方便获取对应的值)

//设置部分列隐藏this.gridView1.CreateColumn("ID", "编号").Visible = false;this.gridView1.CreateColumn("Header_ID", "主表编号").Visible = false;this.gridView1.CreateColumn("Apply_ID", "申请单编号").Visible = false;

如果需要绑定下拉列表类似的字段,那么创建对应的数据类型,然后调用绑定函数绑定即可,如下面代码

//添加下拉列表列,并绑定数据源this.gridView1.CreateColumn("FeeType", "费用类型", 100).CreateComboBox().BindDictItems("费用类型");

如果是一些特殊的输入需要设置格式显示或者掩码,那么如下所示

//创建日期列并指定格式var OccurTime = this.gridView1.CreateColumn("OccurTime", "发生时间", 120).CreateDateEdit();OccurTime.EditMask = "yyyy-MM-dd HH:mm";OccurTime.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm";

另外有一个值得注意的就是我们新增一行从表记录的时候,需要记录一些主表的属性,这样的话,我们就是在行初始化的时候,赋值给从表的隐藏列即可。

//新增行的内容初始化this.gridView1.InitNewRow += (s, e) =>{gridView1.SetRowCellValue(e.RowHandle, "ID", Guid.NewGuid().ToString());gridView1.SetRowCellValue(e.RowHandle, "Header_ID", tempInfo.ID);gridView1.SetRowCellValue(e.RowHandle, "Apply_ID", tempInfo.Apply_ID);gridView1.SetRowCellValue(e.RowHandle, "OccurTime", DateTime.Now);};

在界面中如果我们需要显示主表的信息,那么就根据条件获取对应的主表记录对象,然后显示给界面控件即可。

/// <summary>/// 显示常规的对象内容/// </summary>/// <param name="info"></param>private void DisplayInfo(ReimbursementInfo info){tempInfo = info;//重新给临时对象赋值,使之指向存在的记录对象txtCategory.Text = info.Category;txtReason.Text = info.Reason;txtTotalAmount.Value = info.TotalAmount;txtNote.Text = info.Note;}

而保存的时候,我们把界面内容重新赋值给对应的主表对象。

/// <summary>/// 编辑或者保存状态下取值函数/// </summary>/// <param name="info"></param>private void SetInfo(ReimbursementInfo info){info.Category = txtCategory.Text;info.Reason = txtReason.Text;info.TotalAmount = txtTotalAmount.Value;info.Note = txtNote.Text;info.ApplyDate = DateTime.Now;info.ApplyDept = base.LoginUserInfo.DeptId;info.CurrentLoginUserId = base.LoginUserInfo.ID;}

而我们需要获取GridView明细输入的时候,就通过一个函数遍历获取GridView的行记录,转换为相应的对象即可,如下所示。

/// <summary>/// 获取明细列表/// </summary>/// <returns></returns>private List<ReimbursementDetailInfo> GetDetailList(){var list = new List<ReimbursementDetailInfo>();for (int i = 0; i < this.gridView1.RowCount; i++){var detailInfo = gridView1.GetRow(i) as ReimbursementDetailInfo;if (detailInfo != null){list.Add(detailInfo);}}return list;}

这样处理完这些信息后,我们就可以在主表保存的时候,同时保存明细表信息即可。

/// <summary>/// 新增状态下的数据保存/// </summary>/// <returns></returns>public override bool SaveAddNew(){ReimbursementInfo info = tempInfo;//必须使用存在的局部变量,因为部分信息可能被附件使用SetInfo(info);info.Creator = base.LoginUserInfo.ID;info.CreateTime = DateTime.Now;try{#region 新增数据bool succeed = BLLFactory<Reimbursement>.Instance.Insert(info);if (succeed){//可添加其他关联操作var list = GetDetailList();foreach(var detailInfo in list){BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);}return true;}#endregion}catch (Exception ex){LogTextHelper.Error(ex);MessageDxUtil.ShowError(ex.Message);}return false;}

其中代码

BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);

可以对新增记录保存,也可以对存在的记录进行更新。

通过上面的介绍,我们可以看到不同的主从表其实逻辑还是很通用的,我们可以把它们的逻辑抽取出来,通过代码生成工具进行快速生成即可。

    推荐阅读
  • 太阳能是双碳企业吗(双碳目标之下太阳能热利用行业能否二次腾飞)

    乘着家电下乡政策的东风,这个行业实现了自身发展的首次腾飞。集热器的年度销量在连年下跌后,已经回到2008年的规模水平。日出东方旗下的四季沐歌就是目前仍旧拥有稳定太阳能热水器单机零售渠道的头部品牌之一。《报告》显示,通过对山东、江苏、河北、云南、北京等地太阳能企业抽样调查得知,2020年工程市场占据了企业主营业务版块的74.3%。

  • 减掉10斤要消耗多少卡路里(减掉一公斤脂肪)

    医学减重专家陈伟今天正确的减重应该是减少脂肪组织内的脂肪,数据表明,减掉一公斤脂肪,一般需要消耗7000-10000千卡左右的能量。若每日减少500千卡能量摄入,则需14天减少1公斤;若每日减少1000千卡能量摄入,则需7天减去1公斤。若想通过增加活动量来达到同样的目的,则需要每天高强度锻炼至少1个小时,约能消耗掉500千卡。大家如果有减重方面的问题,想咨询陈伟教授,可以发邮件到邮箱,陈教授会定期为大家答疑解惑。

  • 红薯叶子有哪些禁忌(关于红薯叶子有哪些禁忌)

    红薯叶子有哪些禁忌体寒、肠胃不好的人要少吃红薯叶性凉,体寒、肠胃不好的人要少吃,不然的话可能会加重体寒的症状,增加胃肠道负担,给身体带来危害。避免和豆腐同食红薯叶中含有大量的草酸钙,而豆腐中含有生石灰,二者同食可能会生出草酸钙沉淀,形成一些不可溶解的结晶,造成结石,红薯叶尽量避免和豆腐同食。

  • 李白最美的相思诗(李白最美的一首相思诗)

    《三五七言》秋风清,秋月明,落叶聚还散,寒鸦栖复惊,相思相见知何日,此时此夜难为情。在诗词中,秋夜怀人已经成为习俗。这首《三五七言》由两句三言、两句五言、两句七言组成,故名。《梅庵琴谱》叙述,后三联并非李白所作。有些诗集收录李白《三五七言》时,也只写了前三联。时至今日,我们已经无法考查出后三联是否是李白的真实作品。如果是李白所作,我们亦可窥见李白绵长的情思和高超的写作水平。

  • 和平精英巡查员有什么用(和平精英巡查员的是做什么的)

    和平精英巡查员有什么用?接下来我们就一起去了解一下吧!可以帮助官方检测报道的视频,根据检查的次数获得相应的检称号题,甚至解锁永久的视频巡查员奖励。这些好处仍然很吸引人,想要收集它们的玩家可以尝试提交它们。当成为巡查员以后,会有专属于巡查员的任务,完成他们以后,会获得奖励,每个赛季,都有每个赛季的巡查任务,以及赛季巡查的专属奖励。

  • 在海上感觉的句子(在海上的句子盘点)

    它并不凶猛,也不可怕。我躺在沙滩上,就像躺在摇篮里,又像躺在妈妈的怀里。看这海天一色的美景下,不少花花绿绿的小点以及欢快的呼喊声冲击这人们的视觉与听觉。这欢乐的人们在大海母亲的怀抱中多么自在,多么轻松。我用手轻轻的拍打着浪花,顽皮的浪花溅起了无数颗细小的水珠,溅在脸上凉丝丝的真是舒服。你看,这飞奔的浪花多像一个个淘气的小娃娃呀。

  • 影之诗最强攻略(每日影之诗咸鱼翻身)

    在很多对局中,仅凭佐伊便足以取胜。中期尽快使用凤凰的庭园或进化万花凤凰召唤庭园,并找机会在场上凑齐双庭园。没有以上牌的话,可以使用蜥蜴的吐息解场,或使用龙之传令、激奏佐伊。通常火神龙优先于嗔怒,因为嗔怒与庭园配合更好,也不干扰辉饰拿佐伊。龙铠战士的主战者效果能提供大量额外伤害,可以配合猎龙砍击等法术打出最高满血斩杀,应对安息的领域等减伤手段。对鬼留降诞的涸绝。

  • 王砚辉大人物经典片段(49岁反派专业户王砚辉)

    49岁反派专业户王砚辉现实题材电视剧《小欢喜》近日引发了不小的讨论,剧中实力派演员王砚辉和咏梅组成的区长一家是近年荧屏生活剧中很少见到的干部家庭如何才能把这个“区长老爸”演得像?在王砚辉看来,演干部也好,演父亲也好,无论演。

  • 福建正宗鱼丸的做法(大厨分享秘制鱼丸)

    福建正宗鱼丸的做法鱼肉大家都认识,它是我们餐桌上经常吃到的食物之一,它的营养价值非常高,有丰富的蛋白质,还有维生素等其他微量元素。2根鲢鱼尾,葱姜水,适量盐,适量鸡精,一大勺玉米淀粉,2个鸡蛋清,一勺猪油。

  • 重庆高考成绩查询时间是好久(重庆高考成绩查询时间一样吗)

    包括按规定可安排在提前批次录取的招生专业和计划。包括定向培养士官招生等有面试体检(体测)等特殊要求、航海类等艰苦专业及其他按规定可安排在提前批次录取的专科招生专业及计划,设置2个院校顺序志愿。除高职专科提前批以外的其他专科招生专业及计划,设置96个专业平行志愿。强基计划、香港高校独立招生、民族传统体育和运动训练专业单独招生、飞行技术招生等安排在普通类本科提前批A段前进行。