Visual C# 2005 - 如何于DataGridView控件中以跨数据行方式显示数据

 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;

}

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qdzx2008/archive/2006/10/09/1327353.aspx


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章