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


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