public static class MyControl { public static class DateTimePicker { public static void DateTimePickerMaxDate(params WinControl.DateTimePicker[] dtps) { foreach (WinControl.DateTimePicker var in dtps) { var.MaxDate = Convert.ToDateTime(UserInfo.LOGIN_TIME); } } public static void DateTimePickerInitText(params WinControl.DateTimePicker[] dtps) { foreach (WinControl.DateTimePicker var in dtps) { var.MaxDate = Convert.ToDateTime(UserInfo.LOGIN_TIME); var.CustomFormat = "yyyy-MM-dd"; var.Format = WinControl.DateTimePickerFormat.Custom; var.Text = UserInfo.LOGIN_TIME; } } /// <summary> /// 剪掉一定天数 /// </summary> /// <param name="subdays">剪掉的天数</param> /// <param name="dtps"></param> public static void DateTimePickerInitText(int subdays, params WinControl.DateTimePicker[] dtps) { foreach (WinControl.DateTimePicker var in dtps) { var.MaxDate = Convert.ToDateTime(UserInfo.LOGIN_TIME); var.CustomFormat = "yyyy-MM-dd"; var.Format = WinControl.DateTimePickerFormat.Custom; var.Text = Convert.ToDateTime(UserInfo.LOGIN_TIME).AddDays((double)subdays).ToString("yyyy-MM-dd"); ; } } /// <summary> /// 如果日期控件使用时的日期大于登陆是设置的日期,旧将控件选中的最大日期为登陆 /// </summary> /// <param name="sender">必须为日期控件类型</param> /// <param name="e">可以是空,方法中没有使用到</param> /// <returns></returns> public static bool DateTimePickerCloseUp(object sender, System.EventArgs e) { WinControl.DateTimePicker dtp = sender as WinControl.DateTimePicker; if (dtp != null) { if (dtp.Format != WinControl.DateTimePickerFormat.Custom || dtp.CustomFormat != "yyyy-MM-dd") { dtp.Format = WinControl.DateTimePickerFormat.Custom; dtp.CustomFormat = "yyyy-MM-dd"; } if (Convert.ToDateTime(dtp.Text) > Convert.ToDateTime(UserInfo.LOGIN_TIME)) { dtp.Text = UserInfo.LOGIN_TIME; } return true; } return false; } } public static class TextBox { /// <summary> /// 验证文本框内的输入内容为大于零的数字 /// :要求文本框的Tag为文本框所代表的意思 /// </summary> /// <param name="textBoxs"></param> /// <returns></returns> public static bool TextBoxPriceCheck(params WinControl.TextBox[] textBoxs) { foreach (WinControl.TextBox textBox in textBoxs) { try { if (textBox.Text == null || textBox.Text.ToString().Trim() == "") { textBox.Text = "0"; continue; } else if (float.Parse(textBox.Text.ToString().Trim()) < 0) { throw new Exception(); } } catch { sMessageBox.Show((textBox.Tag ?? "光标所在文本框") + "只能输入大于零的数字。"); textBox.Text = ""; textBox.Focus(); return false; } } return true; } /// <summary> /// 验证容器控件中的文本框是否都是数字 /// </summary> /// <param name="ctr"></param> /// <returns></returns> public static bool CheckPriceTextBoxOfContainer(params Control[] ctr) { foreach (Control var in ctr) { if (var.HasChildren) { foreach (Control var2 in var.Controls) { if (!CheckPriceTextBoxOfContainer(var2)) { return false; } } } if (var.GetType().Name.Equals("TextBox")) { WinControl.TextBox tb = var as WinControl.TextBox; if (tb.ReadOnly == false && !MyControl.TextBox.TextBoxPriceCheck(tb)) { return false; } } } return true; } /// <summary> /// 设置文本框是否为只读 /// </summary> /// <param name="true">true是或false否</param> /// <param name="txtBoxs"></param> /// <returns></returns> public static bool ReadOnly(bool @true, params WinControl.TextBox[] txtBoxs) { foreach (WinControl.TextBox var in txtBoxs) { var.Enabled = !@true; } return true; } /// <summary> /// 清空TextBox属性Text /// </summary> /// <param name="txtBoxs"></param> /// <returns></returns> public static void Clear(params WinControl.TextBox[] txtBoxs) { ResetText("", txtBoxs); } /// <summary> /// 将TextBox属性Text设置成默认值 /// </summary> /// <param name="default"></param> /// <param name="txtBoxs"></param> /// <returns></returns> public static void ResetText(string @default, params WinControl.TextBox[] txtBoxs) { foreach (WinControl.TextBox var in txtBoxs) { var.Text = @default; } } } public static class ComboBox { /// <summary> /// 设置列表框是否为只读 /// </summary> /// <param name="true">true是或false否</param> /// <param name="comBoxs"></param> /// <returns></returns> public static bool ReadOnly(bool @true, params WinControl.ComboBox[] comBoxs) { foreach (WinControl.ComboBox var in comBoxs) { var.Enabled = !@true; } return true; } } public static class Text { /// <summary> /// 将文本转换成Double /// </summary> /// <param name="text"></param> /// <returns></returns> //public static double TextToNumber(string text) //{ // try // { // return double.Parse(text.Trim()); // } // catch // { // return 0; // } //} /// <summary> /// 文本或取对象的Text属性转换为double /// </summary> /// <param name="obj">文本或控件(取控件的Text中的文本)</param> /// <returns></returns> public static double TextToNumber(object obj) { Control ctr = obj as Control; try { if (ctr != null) { return double.Parse(ctr.Text.Trim()); } else { return double.Parse(obj.ToString().Trim()); } } catch { return 0; } } } public static class Clear { /// <summary> /// 清除控件容器或控件的Text属性 /// </summary> /// <param name="control"></param> public static void ClearContainerControlsText(WinControl.Control control) { for (int i = 0; i < control.Controls.Count; i++) { if (control.Controls[i].HasChildren) { //递归 ClearContainerControlsText(control.Controls[i]); } string name = control.Controls[i].GetType().Name.ToString(); if (name.Equals("TextBox")) { WinControl.TextBox tbox = (WinControl.TextBox)control.Controls[i]; if (tbox.ReadOnly != true) { tbox.Clear(); } } else if (name.Equals("ComboBox")) { WinControl.ComboBox com = (WinControl.ComboBox)control.Controls[i]; if (com.Enabled == true) { com.SelectedIndex = -1; com.ResetText(); } } else if (name.Equals("DateTimePicker")) { WinControl.DateTimePicker dtp = (WinControl.DateTimePicker)control.Controls[i]; //dtp.Text = PublicMod.UserInfo.LOGIN_TIME; dtp.Format = WinControl.DateTimePickerFormat.Custom; dtp.CustomFormat = " "; } } } /// <summary> /// 清除控件容器或控件的Text属性 /// </summary> /// <param name="subControl"></param> /// <param name="ClearControlsOfParent">是否清除控件所在容器控件内的其他控件的Text属性</param> //public static void ClearContainerControlsText(WinControl.Control subControl, bool ClearControlsOfParent) //{ // if (subControl.Parent == null) // { // ClearContainerControlsText(subControl); // } // else // { // ClearContainerControlsText(subControl.Parent); // } //} /// <summary> /// 清除控件容器或控件的Text属性,不清空只读或不可用的控件 /// </summary> /// <param name="control"></param> /// <param name="exceptControlName">不进行清除的控件的Name属性</param> public static void ClearContainerControlsText(WinControl.Control control, params string[] exceptControlName) { for (int i = 0; i < control.Controls.Count; i++) { bool flag = false; if (control.Controls[i].HasChildren) { //递归 ClearContainerControlsText(control.Controls[i], exceptControlName); } string name = control.Controls[i].GetType().Name.ToString(); string controlName = control.Controls[i].Name.ToString(); foreach (string var in exceptControlName) { if (var == controlName) { flag = true; break; } } if (flag) { continue; } if (name.Equals("TextBox")) { WinControl.TextBox tbox = (WinControl.TextBox)control.Controls[i]; if (tbox.ReadOnly != true && tbox.Text.Trim() != "") { tbox.Clear(); } } else if (name.Equals("ComboBox")) { WinControl.ComboBox com = (WinControl.ComboBox)control.Controls[i]; if (com.Enabled == true) { com.SelectedIndex = -1; com.Text = ""; } } else if (name.Equals("DateTimePicker")) { WinControl.DateTimePicker dtp = (WinControl.DateTimePicker)control.Controls[i]; //dtp.Text = PublicMod.UserInfo.LOGIN_TIME; dtp.Format = WinControl.DateTimePickerFormat.Custom; dtp.CustomFormat = " "; } else if (name.Equals("CheckBox")) { WinControl.CheckBox cbx = (WinControl.CheckBox)control.Controls[i]; if (cbx.CheckState != CheckState.Unchecked) { cbx.CheckState = WinControl.CheckState.Unchecked; } } else if (name.Equals("RichTextBox")) { WinControl.RichTextBox rtxtBox = (WinControl.RichTextBox)control.Controls[i]; if (rtxtBox.Text.Trim() != "") { rtxtBox.Clear(); } } } } /// <summary> /// 清除控件及子控件的Text属性 /// </summary> /// <param name="c"></param> /// <param name="exceptControl">排除的要进行清除的控件</param> //public static void ClearControlsText(WinControl.Control c, params WinControl.Control[] exceptControl) //{ // foreach (WinControl.Control var in exceptControl) // { // if (c.Name.Equals(var.Name)) // { // continue; // } // ClearControlsText(c); // } //} /// <summary> /// 清除控件及子控件的Text属性 /// </summary> /// <param name="c"></param> public static void ClearControlsText(WinControl.Control c) { if (c.Controls.Count > 0) { foreach (WinControl.Control var in c.Controls) { ClearControlsText(var); } } if (CheckControlType(c)) { c.ResetText(); } } public static void ClearControlsText(params WinControl.Control[] c) { foreach (WinControl.Control var in c) { ClearControlsText(var); } } static bool CheckControlType(WinControl.Control c) { string[] names = new string[] { "TextBox", "ComboBox" };//该数组可以修改 foreach (string var in names) { if (c.GetType().Name.Equals(var)) { return true; } continue; } return false; } /// <summary> /// 清除控件容器或控件的Text属性,包括只读和不可用的控件 /// </summary> /// <param name="control"></param> /// <param name="exceptControlName">不进行清除的控件的Name属性</param> public static void ClearContainerControlsTextAnyway(WinControl.Control control, params string[] exceptControlName) { for (int i = 0; i < control.Controls.Count; i++) { bool flag = false; if (control.Controls[i].HasChildren) { //递归 ClearContainerControlsText(control.Controls[i], exceptControlName); } string name = control.Controls[i].GetType().Name.ToString(); string controlName = control.Controls[i].Name.ToString(); foreach (string var in exceptControlName) { if (var == controlName) { flag = true; break; } } if (flag) { continue; } if (name.Equals("TextBox")) { WinControl.TextBox tbox = (WinControl.TextBox)control.Controls[i]; //if (tbox.ReadOnly != true) //{ tbox.Clear(); //} } else if (name.Equals("ComboBox")) { WinControl.ComboBox com = (WinControl.ComboBox)control.Controls[i]; //if (com.Enabled == true) //{ com.SelectedIndex = -1; com.ResetText(); //} } else if (name.Equals("DateTimePicker")) { WinControl.DateTimePicker dtp = (WinControl.DateTimePicker)control.Controls[i]; //dtp.Text = PublicMod.UserInfo.LOGIN_TIME; dtp.Format = WinControl.DateTimePickerFormat.Custom; dtp.CustomFormat = " "; } else if (name.Equals("CheckBox")) { WinControl.CheckBox cbx = (WinControl.CheckBox)control.Controls[i]; cbx.CheckState = WinControl.CheckState.Unchecked; } else if (name.Equals("RichTextBox")) { WinControl.RichTextBox rtxtBox = (WinControl.RichTextBox)control.Controls[i]; rtxtBox.Clear(); } } } } public static class DataGridView { /// <summary> /// 用于给DataGridView中的行添加一个首列被冻结的为排序的列,排序列自动生成。 /// 如果存在其他列可以排序,还需要在Sorted事件中调用,重新绘制序号 /// </summary> /// <param name="dgv">要添加排序列的GataGridView对象</param> public static void SetRowIndex(WinControl.DataGridView dgv, DataTable dTable) { dgv.AutoGenerateColumns = false; dgv.DataSource = dTable; if (dgv != null) { dgv.AllowUserToAddRows = false; DataTable dt = (DataTable)dgv.DataSource; if (dt != null && !dt.Columns.Contains("RowIndex")) { dt.Columns.Add("RowIndex", typeof(string)); } DataGridViewColumn dgvColumn = null; for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].DataPropertyName == "RowIndex") { if (dgv.Columns[i].Name != "RowIndex") { dgv.Columns[i].Name = "RowIndex"; } } else { continue; } } if (!dgv.Columns.Contains("RowIndex")) { dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell()); dgv.Columns.Add(dgvColumn); } else { dgvColumn = dgv.Columns["RowIndex"]; } //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读; dgvColumn.DisplayIndex = 0; //冻结,列相对静止 dgvColumn.Frozen = true; //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同 dgvColumn.Name = "RowIndex"; dgvColumn.HeaderText = "序号"; //绑定到数据源:不绑定可不行 if (!dgvColumn.IsDataBound) { dgvColumn.DataPropertyName = "RowIndex"; } //样式 dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable; dgvColumn.ReadOnly = true; dgvColumn.Visible = true; //后加 for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName) { dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName; } } //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。 //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。 for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable) { dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } } if (dt != null) { for (int i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["RowIndex"] != DBNull.Value && dt.Rows[i]["RowIndex"].ToString() == "合计") { dt.Rows.RemoveAt(i); dt.AcceptChanges(); //break; } } } //dgv.DataSource = dt; //dt.AcceptChanges(); if (dgv.Rows.Count > 0) { for (int i = 0; i < dgv.Rows.Count; i++) { //获取行的索引号赋值给序号 //行索引号是由行的位置确定的 dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1; } } else if (dt != null && dt.Rows.Count > 0) { object[] obj = null; for (int i = 0; i < dt.Rows.Count; i++) { obj = dt.Rows[i].ItemArray; obj.SetValue((i + 1).ToString(), dt.Columns.IndexOf("RowIndex")); dt.Rows[i].ItemArray = obj; } } if (dt != null) { dt.AcceptChanges(); dgv.DataSource = dt; } } } /// <summary> /// 用于给DataGridView中的行添加一个首列被冻结的为排序的列,排序列自动生成。 /// 如果存在其他列可以排序,还需要在Sorted事件中调用,重新绘制序号 /// </summary> /// <param name="dgv">要添加排序列的GataGridView对象</param> public static void SetRowIndex2(WinControl.DataGridView dgv, DataTable dTable) { dgv.AutoGenerateColumns = false; dgv.DataSource = dTable; if (dgv != null) { dgv.AllowUserToAddRows = false; DataTable dt = (DataTable)dgv.DataSource; if (dt != null && !dt.Columns.Contains("RowIndex")) { dt.Columns.Add("RowIndex", typeof(string)); } DataGridViewColumn dgvColumn = null; for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].DataPropertyName == "RowIndex") { if (dgv.Columns[i].Name != "RowIndex") { dgv.Columns[i].Name = "RowIndex"; } } else { continue; } } if (!dgv.Columns.Contains("RowIndex")) { dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell()); dgv.Columns.Add(dgvColumn); } else { dgvColumn = dgv.Columns["RowIndex"]; } //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读; dgvColumn.DisplayIndex = 0; //冻结,列相对静止 dgvColumn.Frozen = true; //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同 dgvColumn.Name = "RowIndex"; dgvColumn.HeaderText = "序号"; //绑定到数据源:不绑定可不行 if (!dgvColumn.IsDataBound) { dgvColumn.DataPropertyName = "RowIndex"; } //样式 dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable; dgvColumn.ReadOnly = true; dgvColumn.Visible = true; //后加 for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName) { dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName; } } //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。 //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。 //for (int i = 0; i < dgv.Columns.Count; i++) //{ // if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable) // { // dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; // } //} if (dt != null) { for (int i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["RowIndex"] != DBNull.Value && dt.Rows[i]["RowIndex"].ToString() == "合计") { dt.Rows.RemoveAt(i); dt.AcceptChanges(); //break; } } } //dgv.DataSource = dt; //dt.AcceptChanges(); if (dgv.Rows.Count > 0) { for (int i = 0; i < dgv.Rows.Count; i++) { //获取行的索引号赋值给序号 //行索引号是由行的位置确定的 dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1; } } else if (dt != null && dt.Rows.Count > 0) { object[] obj = null; for (int i = 0; i < dt.Rows.Count; i++) { obj = dt.Rows[i].ItemArray; obj.SetValue((i + 1).ToString(), dt.Columns.IndexOf("RowIndex")); dt.Rows[i].ItemArray = obj; } } if (dt != null) { dt.AcceptChanges(); dgv.DataSource = dt; } } } /// <summary> /// 去除订单中多条货物时的重复信息 /// 使用顺序 /// SetRowIndex(); /// BindGridView(); /// SetLastRow(); /// </summary> /// <param name="dtable"></param> /// <param name="accordingName">清除重复记录的依据列,查询结果必须以其排序</param> /// <param name="dgvColunsNames">要去掉的重复行的列名称,必须包含名为"RowIndex"的项,该项是索引项,用于重设索引。</param> public static void BindGridView(WinControl.DataGridView dgv, string accordingName, params string[] dgvColunsNames) { //DataTable _dt = dtable.Clone(); //DataTable _dt = dtable.Copy(); if (dgv == null || dgv.Rows.Count == 0) { return; } DataTable _dt = ((DataTable)dgv.DataSource).Copy(); dgv.DataSource = _dt; //if (_dt != null) //{ // for (int i = 0; i < _dt.Rows.Count; i++) // { // if (_dt.Rows[i]["RowIndex"] != DBNull.Value && _dt.Rows[i]["RowIndex"].ToString() == "合计") // { // _dt.Rows.RemoveAt(i); // //dt.Rows. // _dt.AcceptChanges(); // break; // } // } //} if (dgv.Rows.Count > 0) { //去除订单中多条货物时的重复信息 string[] ColName = dgvColunsNames; string[] KeyColName ={ accordingName }; long RowNum = 1; //装入第一行 DataGridViewRow tmpRow = dgv.Rows[0]; Boolean SameFlag = true; //逐行检查 for (int i = 1; i < dgv.Rows.Count; i++) { //KEY列一致的,则去掉重复信息,默认为一致 SameFlag = true; for (int j = 0; j < KeyColName.Length; j++) { if (dgv.Rows[i].Cells[KeyColName[j]].Value.ToString() != tmpRow.Cells[KeyColName[j]].Value.ToString()) { SameFlag = false; break; } } if (SameFlag) { //如果一致,去掉重复信息 for (int j = 0; j < ColName.Length; j++) { if (ColName[j] != "") { dgv.Rows[i].Cells[ColName[j]].Value = DBNull.Value; } } } else { //如果不一致重新保存比较行 RowNum = RowNum + 1; tmpRow = dgv.Rows[i]; tmpRow.Cells["RowIndex"].Value = RowNum; } } } } /// <summary> /// 生成DataGridView汇总行,不适用于允许列排序 /// 必须搭配SetRowIndex()方法使用 /// </summary> /// <param name="dgv"></param> /// <param name="dgvColunsNames"></param> public static void SetLastRow(WinControl.DataGridView dgv, params string[] dgvColunsNames) { //不允许添加新行 if (dgv.AllowUserToAddRows == true) { dgv.AllowUserToAddRows = false; } if (dgv != null && dgv.Rows.Count > 0) { //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。 //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。 for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable) { dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } } DataTable dt = (DataTable)dgv.DataSource; //dgv.DataSource = dt; DataRow dr = dt.NewRow(); try { foreach (string var in dgvColunsNames) { double obj = 0.0D; for (int i = 0; i < dgv.Rows.Count; i++) { obj += double.Parse(dgv.Rows[i].Cells[var].Value == DBNull.Value ? "0" : (dgv.Rows[i].Cells[var].Value.ToString().Trim() == "" ? "0" : dgv.Rows[i].Cells[var].Value.ToString().Trim())); } //if (var.Substring(var.Length - 1, 1) == "1") //{ // dr[var.Substring(0, var.Length - 1)] = obj.ToString(); //} //else //{ dr[var] = obj.ToString(); //} } } catch (Exception ex) { sMessageBox.Show(ex.Message); } dr["RowIndex"] = "合计"; dt.Rows.Add(dr); //dgv.Rows.in dt.AcceptChanges(); } } /// <summary> /// 设置DataGridView的绑定数据字段名(DataPropertyName)赋值给列名(Name) /// </summary> /// <param name="dgv"></param> public static void SetColumnsNameEqulsDataPropertyName(params WinControl.DataGridView[] dgv) { foreach (WinControl.DataGridView d in dgv) { //d.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; d.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.NotSet; for (int i = 0; i < d.Columns.Count; i++) { if (d.Columns[i].Name != d.Columns[i].DataPropertyName) { d.Columns[i].Name = d.Columns[i].DataPropertyName; d.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; if (d.Columns[i].HeaderText.ToString() == "序号") { d.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; } } //d.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; } } } public static void SetRowIndexAndLastRow(System.Windows.Forms.DataGridView dgv, ref DataTable dTable, params string[] dgvColumnsNames) { dgv.AutoGenerateColumns = false; //dgv.DataSource = dTable; if (dgv != null) { dgv.AllowUserToAddRows = false; //DataTable dt = (DataTable)dgv.DataSource; if (dTable != null && !dTable.Columns.Contains("RowIndex")) { dTable.Columns.Add("RowIndex", typeof(string)); } dgv.DataSource = dTable; DataGridViewColumn dgvColumn = null; for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].DataPropertyName == "RowIndex") { if (dgv.Columns[i].Name != "RowIndex") { dgv.Columns[i].Name = "RowIndex"; } } else { continue; } } if (!dgv.Columns.Contains("RowIndex")) { dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell()); dgv.Columns.Add(dgvColumn); } else { dgvColumn = dgv.Columns["RowIndex"]; } //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读; dgvColumn.DisplayIndex = 0; //冻结,列相对静止 dgvColumn.Frozen = true; //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同 dgvColumn.Name = "RowIndex"; dgvColumn.HeaderText = "序号"; //绑定到数据源:不绑定可不行 if (!dgvColumn.IsDataBound) { dgvColumn.DataPropertyName = "RowIndex"; } //样式 dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable; dgvColumn.ReadOnly = true; dgvColumn.Visible = true; //后加 for (int i = 0; i < dgv.Columns.Count; i++) { if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName) { dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName; } //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。 //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。 if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable) { dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } } if (dTable != null) { for (int i = 0; i < dTable.Rows.Count; i++) { if (dTable.Rows[i]["RowIndex"] != DBNull.Value && dTable.Rows[i]["RowIndex"].ToString() == "合计") { dTable.Rows.RemoveAt(i); dTable.AcceptChanges(); //break; } } } // //dgv.DataSource = dt; // //dt.AcceptChanges(); if (dgv.Rows.Count > 0) { for (int i = 0; i < dgv.Rows.Count; i++) { //获取行的索引号赋值给序号 //行索引号是由行的位置确定的 dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1; } } else if (dTable != null && dTable.Rows.Count > 0) { object[] obj = null; for (int i = 0; i < dTable.Rows.Count; i++) { obj = dTable.Rows[i].ItemArray; obj.SetValue((i + 1).ToString(), dTable.Columns.IndexOf("RowIndex")); dTable.Rows[i].ItemArray = obj; } } if (dTable != null) { dTable.AcceptChanges(); //dgv.DataSource = dt; } } ////不允许添加新行 //if (dgv.AllowUserToAddRows == true) //{ // dgv.AllowUserToAddRows = false; //} if (dgv != null && dgv.Rows.Count > 0) { ////不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。 ////允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。 //for (int i = 0; i < dgv.Columns.Count; i++) //{ // if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable) // { // dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; // } //} //DataTable dt = (DataTable)dgv.DataSource; //dgv.DataSource = dt; if (dgvColumnsNames.Length > 0) { DataRow dr = dTable.NewRow(); try { foreach (string var in dgvColumnsNames) { double obj = 0.0D; for (int i = 0; i < dgv.Rows.Count; i++) { obj += double.Parse(dgv.Rows[i].Cells[var].Value == DBNull.Value ? "0" : dgv.Rows[i].Cells[var].Value.ToString().Trim()); } if (var.Substring(var.Length - 1, 1) == "1") { dr[var.Substring(0, var.Length - 1)] = obj.ToString(); } else { dr[var] = obj.ToString(); } } } catch (Exception ex) { sMessageBox.Show(ex.Message); } dr["RowIndex"] = "合计"; dTable.Rows.Add(dr); } //dgv.Rows.in dTable.AcceptChanges(); } } } public static class UnEnableControls { public static void UnEnableControl(WinControl.Control ctr) { foreach (WinControl.Control var in ctr.Controls) { var.Enabled = false; } } public static void UnEnableControl(params WinControl.Control[] ctr) { foreach (WinControl.Control var in ctr) { foreach (WinControl.Control var2 in var.Controls) { var2.Enabled = false; } var.Enabled = false; } } public static void UnEnableControl(bool flag, params WinControl.Control[] ctr) { foreach (WinControl.Control var in ctr) { foreach (WinControl.Control var2 in var.Controls) { var2.Enabled = flag; } var.Enabled = flag; } } } public static class Button { /// <summary> /// 是否禁用 /// </summary> /// <param name="flag">true可用,false禁用</param> /// <param name="btn"></param> public static void Enable(bool flag, params WinControl.Button[] btn) { foreach (WinControl.Button var in btn) { var.Enabled = flag; } } /// <summary> /// 禁用 /// </summary> /// <param name="btn"></param> public static void Enable(params WinControl.Button[] btn) { Enable(false, btn); } } /// <summary> /// 禁用 /// </summary> /// <param name="ctl"></param> public static void Enable(params WinControl.Control[] ctl) { Enable(false, ctl); } /// <summary> /// 是否禁用 /// </summary> /// <param name="flag">true可用,false禁用</param> /// <param name="ctl"></param> public static void Enable(bool flag, params WinControl.Control[] ctl) { foreach (WinControl.Control var in ctl) { var.Enabled = flag; } } /// <summary> /// 设置与控件关联的文本属性 /// </summary> /// <param name="default">属性值</param> /// <param name="ctl"></param> public static void ResetText(string @default, params WinControl.Control[] ctl) { foreach (WinControl.Control var in ctl) { var.Text = @default; } } /// <summary> /// 设置与控件关联的文本属性为空串 /// </summary> /// <param name="ctl"></param> public static void ResetText(params WinControl.Control[] ctl) { ResetText("", ctl); } /// <summary> /// 将控件的只读属性进行设置 /// </summary> /// <param name="ctl"></param> public static void Readonly(params WinControl.Control[] ctl) { Readonly(true, ctl); } /// <summary> /// 将控件的只读属性进行设置 /// </summary> /// <param name="bool"></param> /// <param name="ctl"></param> public static void Readonly(bool @bool, params WinControl.Control[] ctl) { foreach (WinControl.Control var in ctl) { TextBoxBase tbb = var as TextBoxBase; if (tbb != null) { tbb.ReadOnly = @bool; } } } }