Visual C# 2005 - 如何于DataGridView控件中以跨数据行方式显示数据
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
![]() 图表1
一般来说,每一个字段的内容会单独显示于DataGridView控件的一个数据行中。问题是,某些字段拥有大量文字数据,我是不是能够让该字段的内容以跨数据行的方式来显示,以便在有限的画面空间中的呈现出更完整的内容呢?答案当然是肯定的。
以图表1所示的执行画面而言,「自传」字段的内容并未单独显示于一个数据行中,而是以横跨数据行的方式,显示在同笔数据列之各字段内容的下方。相关程序代码列示如下:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; … … … private int oldRowIndex = 0; private const int CUSTOM_CONTENT_HEIGHT = 80; private DataSet myDataSet; private void CH13_DemoForm009_Load(object sender, EventArgs e) { Padding newPadding = new Padding(0, 1, 0, CUSTOM_CONTENT_HEIGHT); this.DataGridView1.RowTemplate.DefaultCellStyle.Padding = newPadding; this.DataGridView1.RowTemplate.DefaultCellStyle.SelectionBackColor = Color.Transparent; this.DataGridView1.RowTemplate.Height += CUSTOM_CONTENT_HEIGHT; this.DataGridView1.AllowUserToAddRows = false; this.DataGridView1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2; this.DataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None; this.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; myDataSet = LoadDataToDataSet(); if(myDataSet != null) { // 将 BindingSource 组件系结至数据集对象中的「飞狐工作室」数据表。 this.BindingSource1.DataMember = "飞狐工作室"; this.BindingSource1.DataSource = myDataSet; this.BindingSource1.AllowNew = false; // 将 BindingNavigator 控件的数据来源也设定成 BindingSource 组件 //,如此一来,就可以使用 BindingNavigator 控件去导览 // DataGridView 控件中的数据列。 this.BindingNavigator1.BindingSource = this.BindingSource1; this.DataGridView1.DataSource = this.BindingSource1; } else { return; } this.DataGridView1.Columns[4].Visible = false; this.DataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable; this.DataGridView1.Columns[2].SortMode = DataGridViewColumnSortMode.NotSortable; this.DataGridView1.Columns[3].SortMode = DataGridViewColumnSortMode.NotSortable; this.DataGridView1.AutoResizeRows( DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); } private void DataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) { this.DataGridView1.Invalidate(); } private void DataGridView1_CurrentCellChanged(object sender, EventArgs e) { if(oldRowIndex != -1) { this.DataGridView1.InvalidateRow(oldRowIndex); } oldRowIndex = this.DataGridView1.CurrentCellAddress.Y; } private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { e.PaintParts = e.PaintParts & (~DataGridViewPaintParts.Focus); if((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) { Rectangle rowBounds = new Rectangle( this.DataGridView1.RowHeadersWidth, e.RowBounds.Top, this.DataGridView1.Columns.GetColumnsWidth( DataGridViewElementStates.Visible) - this.DataGridView1.HorizontalScrollingOffset + 1, e.RowBounds.Height); System.Drawing.Drawing2D.LinearGradientBrush backbrush = new System.Drawing.Drawing2D.LinearGradientBrush(rowBounds, this.DataGridView1.DefaultCellStyle.SelectionBackColor, e.InheritedRowStyle.ForeColor, System.Drawing.Drawing2D.LinearGradientMode.Horizontal); try { e.Graphics.FillRectangle(backbrush, rowBounds); } finally { backbrush.Dispose(); } } } private void DataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rowBounds = new Rectangle(this.DataGridView1.RowHeadersWidth, e.RowBounds.Top, this.DataGridView1.Columns.GetColumnsWidth( DataGridViewElementStates.Visible) - this.DataGridView1.HorizontalScrollingOffset + 1, e.RowBounds.Height); SolidBrush forebrush = null; try { if((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) { forebrush = new SolidBrush(e.InheritedRowStyle.SelectionForeColor); } else { forebrush = new SolidBrush(e.InheritedRowStyle.ForeColor); } Object recipe = this.DataGridView1.Rows.SharedRow(e.RowIndex).Cells[4].Value; if(!(recipe == null)) { string text = recipe.ToString(); Rectangle textArea = rowBounds; RectangleF clip = textArea; textArea.X -= this.DataGridView1.HorizontalScrollingOffset; textArea.Width += this.DataGridView1.HorizontalScrollingOffset; textArea.Y += rowBounds.Height - e.InheritedRowStyle.Padding.Bottom; textArea.Height -= rowBounds.Height - e.InheritedRowStyle.Padding.Bottom; textArea.Height = (textArea.Height / e.InheritedRowStyle.Font.Height) * e.InheritedRowStyle.Font.Height; clip.Width -= this.DataGridView1.RowHeadersWidth + 1 - clip.X; clip.X = this.DataGridView1.RowHeadersWidth + 1; RectangleF oldClip = e.Graphics.ClipBounds; e.Graphics.SetClip(clip); e.Graphics.DrawString(text, e.InheritedRowStyle.Font, forebrush, textArea); e.Graphics.SetClip(oldClip); } } finally { forebrush.Dispose(); } if (this.DataGridView1.CurrentCellAddress.Y == e.RowIndex) { e.DrawFocus(rowBounds, true); } } private void DataGridView1_RowHeightChanged( object sender, DataGridViewRowEventArgs e) { int preferredNormalContentHeight = e.Row.GetPreferredHeight(e.Row.Index, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, true) - e.Row.DefaultCellStyle.Padding.Bottom; Padding newPadding = e.Row.DefaultCellStyle.Padding; newPadding.Bottom = e.Row.Height - preferredNormalContentHeight; e.Row.DefaultCellStyle.Padding = newPadding; } // 本程序会连接至数据来源并建立所需的 DataSet 对象。 private DataSet LoadDataToDataSet() { // 利用 SqlConnectionStringBuilder 对象来构建连接字符串。 SqlConnectionStringBuilder sqlStringBuilder = new SqlConnectionStringBuilder(); sqlStringBuilder.DataSource = @"(local)\SQLEXPRESS"; sqlStringBuilder.InitialCatalog = "北风贸易"; sqlStringBuilder.IntegratedSecurity = true; // 建立一个数据集。 DataSet ds = new DataSet(); try { using (SqlConnection northwindConnection = new SqlConnection(sqlStringBuilder.ConnectionString)) { SqlCommand cmdLiming = new SqlCommand( "SELECT 姓名,员工性别,出生日期, 目前薪资, 自传" + " FROM dbo.飞狐工作室 WHERE 自传 IS NOT NULL", northwindConnection); northwindConnection.Open(); using (SqlDataReader drLiming = cmdLiming.ExecuteReader()) { ds.Load( drLiming, LoadOption.OverwriteChanges, new string[] { "飞狐工作室" }); } } } catch (Exception) { MessageBox.Show( "要能够顺利执行本范例程序,您的计算机必须已安装 SQL Server " + "Express,并且必须已附加了本书所附的「北风贸易」数据库。" + "关于如何安装 SQL Server Express,请参阅附录或相关文件说明。"); // 无法连接至 SQL Server。 return null; } return ds; } 建议阅读书籍:《Visual C# 2005文件IO与数据存取秘诀》(机械工业出版社,预计2006年12月出版)。 本文出自 “章立民” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |




章立民
博客统计信息
热门文章
最新评论
友情链接