广

ASP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-16 10:58:08 次阅读 稿源:互联网
    零七广告

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

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告