ExtensionMethod.cs

来源:互联网 发布:2016总决赛g7数据统计 编辑:程序博客网 时间:2024/05/09 19:29

using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
// 添加引用 -> .NET -> Microsoft.Office.Interop.Excel(2003->11.0, 2007->12.0)

namespace ProductManager
{
    public static class ExtensionMethod
    {
        private static ToolTip tipText;

        static ExtensionMethod()
        {
            #region
            tipText = new ToolTip();
            tipText.IsBalloon = true; // 使用气球状窗口的值。
            tipText.ToolTipIcon = ToolTipIcon.Warning;
            tipText.ToolTipTitle = "企业销售管理系统";
            #endregion
        }

        /// <summary>
        /// 根据视图获取自动编号。
        /// </summary>
        /// <param name="dataView"></param>
        /// <param name="letters"></param>
        /// <returns></returns>
        #region
        public static string GetNewID(this DataView dataView, string letters)
        {
            dataView.RowFilter = null; // 清除该筛选器。
            dataView.RowStateFilter = DataViewRowState.CurrentRows; // 包括未更改行、新行和已修改行的当前行。
            var query = from item in dataView.Cast<DataRowView>()
                        let ID = item.Row.Field<string>(0).Substring(letters.Length)
                        select ID;
            int id = query.Any() ? int.Parse(query.Max()) + 1 : 1;
            return string.Format("{0}{1:D3}", letters, id); // D3 <=> 000
        }
        #endregion

        /// <summary>
        /// 使用 SELECT 语句从数据源中检索数据。
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="selectText"></param>
        /// <returns></returns>
        #region
        public static DataView AsDataView(this DataTable table, string selectText)
        {
            try
            {
                using (SqlDataAdapter adapter = new SqlDataAdapter(selectText, DBConnection.SQL))
                {
                    table.Clear();
                    table.BeginLoadData(); // 在加载数据时关闭通知、索引维护和约束。
                    adapter.Fill(table);
                    table.EndLoadData(); // 在加载数据后打开通知、索引维护和约束。
                }
            }
            catch (Exception se)
            {
                MessageBox.Show(se.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return table.AsDataView();
        }
        #endregion

        /// <summary>
        /// 用 DataGridView 控件打印 Excel 表。
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="caption"></param>
        #region
        public static void PrintToExcel(this DataGridView gridView, string caption)
        {
            Excel.Application newExcel = new Excel.Application();
            try
            {
                Excel.Workbook newBook = newExcel.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                Excel.Worksheet newSheet = newBook.ActiveSheet as Excel.Worksheet;
                newExcel.Visible = true;
                newBook.Password = "jinzhexian";
                newSheet.Name = caption;
                Excel.Range newRange = newSheet.get_Range("B1", Type.Missing).get_Resize(2, gridView.ColumnCount);
                newRange.MergeCells = true; // 合并单元格。
                newRange.Font.Size = 16;
                newRange.Value2 = caption;
                newRange = newRange.get_Offset(1, 0).get_Resize(1, gridView.ColumnCount);
                newRange.Value2 = gridView.Columns.Cast<DataGridViewColumn>().Select(sm => sm.HeaderText).ToArray();
                foreach (DataGridViewRow row in gridView.Rows)
                {
                    newRange = newRange.get_Offset(1, 0);
                    newRange.Value2 = row.Cells.Cast<DataGridViewCell>().Select(sm => sm.FormattedValue).ToArray();
                }
                newRange = newRange.get_Offset(1, 0).get_Resize(2, gridView.ColumnCount);
                newRange.MergeCells = true; // 合并单元格。
                newRange.Value2 = string.Format("打印日期: {0:yyyy'年'M'月'd'日'}", DateTime.Today);
                newRange.EntireColumn.AutoFit(); // 自动调整列宽。
                newRange.EntireColumn.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                newSheet.get_Range("A4", Type.Missing).Select();
                newExcel.SendKeys("%WFF", true); // 冻结拆分窗格 Microsoft Office 2003(%WF), 2007(%WFF)。
            }
            catch
            {
                newExcel.Quit();
            }
            finally
            {
                newExcel = null;
                GC.Collect();
            }
        }
        #endregion

        /// <summary>
        /// 设置 SplitContainer 拆分器的样式。
        /// </summary>
        /// <param name="split"></param>
        #region
        public static void SetStyle(this SplitContainer split)
        {
            split.BorderStyle = BorderStyle.Fixed3D;
            split.Dock = DockStyle.Fill;
            split.FixedPanel = FixedPanel.Panel1;         // 指定 SplitContainer.Panel1 面板的大小保持不变。
            split.IsSplitterFixed = true;                // 禁用拆分器移动。
            split.Orientation = Orientation.Horizontal; // 水平放置控件或元素。
            split.SplitterDistance = 360;              // 设置拆分器离 SplitContainer 的左边缘或上边缘的位置。
        }
        #endregion

        /// <summary>
        /// 设置应用于 DataGridView 中的单元格的默认单元格样式。
        /// </summary>
        /// <param name="gridView"></param>
        #region
        public static void SetStyle(this DataGridView gridView)
        {
            gridView.AllowUserToAddRows = false;        // 禁用添加行。
            gridView.AllowUserToDeleteRows = false;    // 禁用删除行。
            gridView.AllowUserToOrderColumns = false; // 禁用列排序。
            gridView.AllowUserToResizeRows = false;  // 禁用调整行高。
            gridView.AutoGenerateColumns = false;   // 禁用自动创建列。
            gridView.EnableHeadersVisualStyles = true; // 启用可视样式。
            gridView.MultiSelect = false; // 用户仅能选择一个单元格、行或列。
            gridView.ReadOnly = true;    // 禁用编辑单元格。
            gridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 调整列宽仅适合位于当前屏幕上显示的所有单元格(包括标头单元格)的内容。
            gridView.BackgroundColor = Color.Lavender;
            gridView.BorderStyle = BorderStyle.Fixed3D;
            gridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter;
            gridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; // 禁用调整列标题的高度。
            gridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            gridView.Dock = DockStyle.Fill;
            gridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader; // TopLeftHeaderCell.Value。
            gridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 通过单击行的标头或是该行所包含的单元格选定整个行。
        }
        #endregion

        /// <summary>
        /// 将 TextBoxBase,ListControl,DateTimePicker 控件的 Text 属性重置为其默认值。
        /// </summary>
        /// <param name="gb"></param>
        #region
        public static void ClearText(this GroupBox gb)
        {
            foreach (ListControl list in gb.Controls.OfType<ListControl>())
            {
                list.ResetText();
                list.SelectedIndex = -1;
            }
            foreach (TextBoxBase text in gb.Controls.OfType<TextBoxBase>())
            {
                text.Clear();
            }
            foreach (DateTimePicker dtp in gb.Controls.OfType<DateTimePicker>())
            {
                dtp.ResetText();
            }
            //foreach (Control ctrl in gb.Controls)
            //{
            //    if (ctrl is TextBoxBase || ctrl is ListControl || ctrl is DateTimePicker)
            //        ctrl.ResetText();
            //    ListControl list = ctrl as ListControl;
            //    if (list != null)
            //        list.SelectedIndex = -1;
            //}
        }
        #endregion

        /// <summary>
        /// 在 TextBoxBase 控件输入无效字符时,提示信息。
        /// </summary>
        /// <param name="e"></param>
        /// <param name="maskedText"></param>
        /// <param name="caption"></param>
        #region
        public static void ShowMessage(this MaskInputRejectedEventArgs e, MaskedTextBox maskedText, string caption)
        {
            if (e.Position < maskedText.TextLength)
                tipText.Show(caption, maskedText, 3000);
            else
                tipText.Hide(maskedText);
        }
        #endregion

        /// <summary>
        /// 指示指定的 Unicode 字符是否属于 Decimal(0-9) 类别。
        /// </summary>
        /// <param name="e"></param>
        #region
        public static void IsDigit(this KeyPressEventArgs e)
        {
            e.Handled = !(char.IsDigit(e.KeyChar) || (Keys)e.KeyChar == Keys.Back || (Keys)e.KeyChar == Keys.Delete);
        }
        #endregion

        /// <summary>
        /// 指示指定的 Unicode 字符是否属于 Decimal(###0.00) 类别。
        /// </summary>
        /// <param name="e"></param>
        #region
        public static void IsMoney(this KeyPressEventArgs e)
        {
            e.Handled = !(char.IsDigit(e.KeyChar) || e.KeyChar == '.' || (Keys)e.KeyChar == Keys.Back || (Keys)e.KeyChar == Keys.Delete);
        }
        #endregion

        /// <summary>
        /// 验证用户密码。
        /// </summary>
        /// <param name="e"></param>
        #region
        public static void IsPassword(this KeyPressEventArgs e)
        {
            e.Handled = !(char.IsLetterOrDigit(e.KeyChar) || e.KeyChar == '-' || e.KeyChar == '_' || (Keys)e.KeyChar == Keys.Back || (Keys)e.KeyChar == Keys.Delete);
        }
        #endregion

        /// <summary>
        /// 从 TextBoxBase 控件文本中移除所有空白字符后保留的字符数。
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        #region
        public static int TextTrimLength(this TextBoxBase textArea)
        {
            return textArea.Text.Trim().Length;
        }
        #endregion

        /// <summary>
        /// 验证电子邮件格式 E-mail。
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        #region
        public static bool IsValidEmail(this TextBoxBase email)
        {
            return Regex.IsMatch(email.Text, @"/w+([-+.']/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*");
        }
        #endregion

        /// <summary>
        /// 验证中国身份证号码 ID Card。
        /// </summary>
        /// <param name="cardID"></param>
        /// <returns></returns>
        #region
        public static bool IsValidCardID(this TextBoxBase cardID)
        {
            return Regex.IsMatch(cardID.Text, @"/d{17}[/d|X]|/d{15}");
        }
        #endregion

        /// <summary>
        /// 验证中国电话号码。
        /// </summary>
        /// <param name="phone"></param>
        /// <returns></returns>
        #region
        public static bool IsValidPhone(this TextBoxBase phone)
        {
            return Regex.IsMatch(phone.Text, @"(/(/d{3}/)|/d{3}-)?/d{8}");
        }
        #endregion
    }
}