• 如何于DataGridView控件中以跨数据行方式显示数据


    一般来说,每一个字段的内容会单独显示于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;
    }

  • 相关阅读:
    IOS手机 html5页面 数字变成蓝色链接的原因
    html5预加载图片的写法
    jquery取消绑定的方法
    CSS3幸运大转盘最简单的写法
    深度搜索应用之黑白图像(非递归)
    springday03-go1
    springday02-go4
    spring day02-go3
    springday02-go2
    spring da-y02-go1
  • 原文地址:https://www.cnblogs.com/szyicol/p/525442.html
Copyright © 2020-2023  润新知