WinForm中可折叠的DataGridView

Download Source - 123KB

  DataGridView是WinForm中非常灵活的一个控件,对于扩展其折叠功能的控件在网上已经有很多文章,但是只简要介绍了实现的方法,没有继续封装其他方法,比如数据绑定和增删功能,都需要在后置代码自己编写,加之复杂的业务逻辑,让代码显得冗余且不易复用。

  在前人的基础上,利用封装好的CollapseDataGridViewRow和CollapseDataGridViewRowCollection类,对CollapseDataGridView进行了功能扩展,新增了几个泛型方法和委托事件,尽量降低了控件逻辑与业务逻辑的耦合。

  新增了CollapseDataGridViewEventArgs事件参数,包含bool Result/执行结果,int RowIndex/影响的行号,string ErrorMessage/错误信息

  在CollapseDataGridViewRow类中增加了GroupTag属性,用于保存集合信息,Tag用于保存集合首行对应的条目实例

      在使用该控件前,需要定义三个类型,以代表团和运动员为例:

  • Athlete                 条目类
  • AthleteItemList : List<Athlete>     集合类,可以添加一些集合自有属性,用于保存条目的公共信息
  • AthleteGroupList : List<List<Athlete>>  集合列表类,调用控件BindDataSource<GL, T>(GL groupList) where GL : List<List<T>>方法时使用

       初始列表需要用户自己组织好AthleteGroupList列表,对控件进行数据绑定。将控件从左侧工具箱拖拽入设计区

      

      像使用一般的DataGridView一样,对控件进行DataPropertyName的设置,否则在使用默认数据绑定方法时无法绑定该数据行(自定义绑定方法除外)。此外SortMode属性设置为NotSortable,排序有点小复杂,还没动手做。。。 

    

  在CollapseDataGridView增加了如下几个属性,用于控制外观:

  

  完成以上设置就可以开始编写后台代码了。可以根据需要预先绑定几个事件,用于在列表数据发生变化时,处理业务逻辑。


  提供的事件如下:

  • OnBindDataDetail:数据绑定事件,在调用BindDataSource<GL, T>(GL groupList) 方法后,触发该事件,返回(object item/条目实例, int rowIndex/条目所在行号, bool isMainItem/条目是否为集合首行),可以根据三者条件编写绑定行Cell显示数据的逻辑。
  • AddGroupCompleted:新增集合事件,返回(object group/集合实例, CollapseDataGridViewEventArgs e/事件参数)
  • RemoveGroupCompleted:移除集合事件
  • AddItemCompleted:新增条目事件
  • RemoveItemCompleted:移除条目事件
  • OnDataCountChanged:集合或条目数量改变事件,可用于更新UI
            //注册行绑定事件 -- 可以去掉该行注释,使用自定义绑定行数据模式
//this.cdgvAthleteInfo.OnBindDataDetail += new CollapseDataGridView.BindDataDetailHandler(cdgvAthleteInfo_OnBindDataDetail);
//注册新增集合事件
this.cdgvAthleteInfo.AddGroupCompleted += new CollapseDataGridView.AddGroupHandler(cdgvAthleteInfo_AddGroupCompleted);
//注册删除集合事件
this.cdgvAthleteInfo.RemoveGroupCompleted += new CollapseDataGridView.RemoveGroupHandler(cdgvAthleteInfo_RemoveGroupCompleted);
//注册新增条目事件
this.cdgvAthleteInfo.AddItemCompleted += new CollapseDataGridView.AddItemHandler(cdgvAthleteInfo_AddItemCompleted);
//注册删除条目事件
this.cdgvAthleteInfo.RemoveItemCompleted += new CollapseDataGridView.RemoveItemHandler(cdgvAthleteInfo_RemoveItemCompleted);
//注册数据源数量变更事件
this.cdgvAthleteInfo.OnDataCountChanged += new CollapseDataGridView.DataCountChangedHandler(cdgvAthleteInfo_OnDataCountChanged);

  提供的公共接口如下:

  • 数据源绑定方法:void BindDataSource<GL, T>(GL groupList) where GL : List<List<T>>,GL为集合列表的类型,T为条目类型,如果用户没有注册OnBindDataDetail事件,则使用默认的数据绑定方式,CollapseDataGridView中每个集合的[0,0]位置显示分组标记的值,[i,0](i > 0)的位置不显示分组标记的值。该方法通过控件每列设置的DataPropertyName从提供的GL数据源中反射出相应的值,并绑定在Cell的Value中,没有反射到属性则绑定null。
  • 获取集合信息方法:G GetGroupInfo<G>(),G为集合类型,返回选中行所在集合的信息
  • 新增条目方法:void AddItem<G, T>(T item) where G : List<T>,G为集合类型,T为条目类型。之所以需要传入集合类型,是因为当传入null集合时或当前CollapseDataGridView为空,目标行将作为新的集合加入CollapseDataGridView中,则需要使用G反射获得其实例,绑定在GroupTag中,随后使用G GetGroupInfo<G>()方法时,才能由object转换成G类型,若以List<T>绑定在GroupTag中,取回时,G类型中的公共属性会丢失。
  • 插入条目方法:void InsertItem<G, T>(T item) where G : List<T>
  • 移除条目方法:void RemoveItem<T>(int itemIndex)
  • 新增集合方法:void AddGroup<G, T>(G group) where G : List<T>
  • 插入集合方法:void InsertGroup<G, T>(G group) where G : List<T>
  • 移除集合方法:void RemoveGroup(int itemIndex)

  以上方法都对应了上面提到的事件,可以获取相应的参数,进行一些业务逻辑的处理。

  不足和可能存在的Bug:

  • 异常处理尚未完善,可能存在未知的异常
  • 泛型的使用和部分代码冗余

  个人学习,欢迎指正,仅供参考

  参考文章:这里这里

转载于:https://www.cnblogs.com/lichence/archive/2011/08/18/2145001.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Winform DataGridView美化指的是通过修改DataGridView的外观和样式,使其更加美观和易于使用。可以通过以下方法实现: 1. 修改DataGridView的背景颜色、字体、边框等属性,使其与应用程序的整体风格相符。 2. 使用自定义单元格样式,例如添加图标、背景图片、渐变色等,使DataGridView更加生动和有趣。 3. 使用自定义列头样式,例如添加图标、背景图片、渐变色等,使DataGridView的列头更加醒目和易于识别。 4. 使用自定义滚动条样式,例如添加背景图片、滑块图片等,使DataGridView的滚动条更加美观和易于使用。 5. 使用第三方控件或库,例如DevExpress、Telerik等,提供了丰富的DataGridView美化功能,可以快速实现高质量的DataGridView界面效果。 总之,Winform DataGridView美化可以通过多种方式实现,可以根据具体需求选择最适合的方法。 ### 回答2: WinFormDataGridView是一个常用的控件,用于显示和编辑表格数据。但是,其默认的样式有点简陋,不太适合精美的应用场景。因此,美化DataGridView是提升应用界面质量的必要步骤之一。 下面我将介绍一些常用的方法,帮助您美化DataGridView控件。 1.更换单元格样式 第一步是更换单元格的样式。可以通过修改默认单元格的背景颜色和字体样式来调整DataGridView的外观。 ```csharp dataGridView1.DefaultCellStyle.BackColor = Color.White; dataGridView1.DefaultCellStyle.Font = new Font("Tahoma", 8); ``` 这里,我将单元格的背景颜色设置成了白色,字体样式设置成了Tahoma,字号为8。 2.添加行间隔色 通过设置AlternatingRowsDefaultCellStyle实现添加行间隔色。 ```csharp dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; ``` 这里我将奇数行的背景颜色设置为淡灰色。 3.设置表格线颜色和样式 可以通过设置BorderStyle属性来更改单元格边框样式。此外,可以通过设置ColumnHeadersDefaultCellStyle修改表头的样式,并通过设置GridColor调整表格的线条颜色。 ```csharp dataGridView1.BorderStyle = BorderStyle.None; dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Black; dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; dataGridView1.GridColor = Color.Black; ``` 以上代码将DataGridView的边框线条隐藏,表头背景色设置为黑色,前景色设置为白色。此外,表格的线条颜色被设置为黑色。 4.自定义单元格样式 在某些情况下,您可能需要根据不同的数据状态设置单元格的外观(例如,根据数据值设置单元格背景颜色)。在这种情况下,可以使用DataGridView.CellFormatting事件来为单元格应用自定义样式。 ```csharp private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.ColumnIndex == 0 && Convert.ToInt32(e.Value) < 0) { e.CellStyle.BackColor = Color.Red; e.CellStyle.ForeColor = Color.White; } } ``` 以上代码会在第1列的数据小于0时将单元格的背景色设置为红色,字体颜色设置为白色。 总之,通过以上的方法,我们可以轻松地美化DataGridView控件。当然,还有更多的定制选项可以进一步调整控件外观,如按下高亮、列宽、行高等。通过不断的尝试,您可以找到最适合您应用程序的样式。 ### 回答3: WinFormDataGridView是一个非常常见的控件,可以用来展示数据和编辑数据。但是,其默认的样式比较单调,很难满足我们对于美观、易用性等方面的需求。本文将为大家介绍如何对WinFormDataGridView进行美化。 1. 更改默认样式 DataGridView控件的默认样式可能不太符合我们的需求,比如行和列之间有较宽的间距、背景色不好看等等。我们可以通过更改控件属性来实现自定义样式。 例如,我们可以设置控件的背景色、前景色、网格线颜色、行高等属性,来改变控件的默认样式。此外,我们还可以自定义列头和行头的样式,来使控件更加美观。 2. 使用第三方控件库 对于一些高度定制化的DataGridView需求,我们可以考虑使用第三方控件库,如DevExpress、Telerik等。这些控件库提供了大量的样式、自定义属性等功能,可以帮助我们快速实现需求。 例如,DevExpress有GridView控件,Telerik有RadGridView控件,都可以用来展示数据并实现美化效果。 3. 使用自定义绘制 DataGridView控件提供了自定义绘制的功能,通过继承DataGridView并重写方法,我们可以完全控制控件的样式。 例如,我们可以重写控件的OnPaint方法,自己绘制单元格、行、列的外观,从而实现完全的个性化定制。 总结 在WinForm开发,对于数据展示和数据编辑功能,DataGridView控件是一个非常常见的控件。为了实现更好的用户体验和更美观的界面,我们可以对其进行美化。我们可以通过改变默认样式、使用第三方控件库或自定义绘制来实现DataGridView的美化效果。选择合适的方法,可以帮助我们轻松达到之前的美化效果,让应用变得更加专业和舒适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值