
CDataGrid

enum DataMask
{ Num, Float, Date, NvChar, Bit };

[ToolboxBitmap(typeof(System.Windows.Forms.DataGridView))]
class CDataGrid : DataGridView

{
public DataMask val_type;
public object val_default;
public bool val_null;

public CDataGrid()

{
val_type = new DataMask();
val_default = null;
val_null = true;

this.CellValidated += new DataGridViewCellEventHandler(CDataGrid_CellValidated);

this.RowsAdded += new DataGridViewRowsAddedEventHandler(CDataGrid_RowsAdded);
this.RowsRemoved += new DataGridViewRowsRemovedEventHandler(CDataGrid_RowsRemoved);
this.CellEndEdit += new DataGridViewCellEventHandler(CDataGrid_CellEndEdit);

}//构造函数

public string cValue

{
get

{
return "'" + this.CurrentCell.Value.ToString() + "'";
}
}

public void PaintEachOtherGridItem(Color cor)

{
if (this.Rows.Count != 0)

{
for (int i = 0; i < this.Rows.Count; )

{
this.Rows[i].DefaultCellStyle.BackColor = cor;
i += 2;
}
}
}//隔行着色

public void FillTableRow(System.Data.DataTable table)

{
this.Visible = false;
this.Rows.Clear();
for (int i = 0; i < table.Rows.Count; i++) //显示到表格

{
this.Rows.Add();
for (int j = 0; j < table.Columns.Count; j++)

{
if (table.Rows[i][j].ToString().Length>0)
this.Rows[i].Cells[j + 1].Value = table.Rows[i][j].ToString();
}
}
this.Visible = true;
}//填充数据,行

public void Fill(System.Data.DataTable table)

{
this.Visible = false;
this.Rows.Clear();
this.Columns.Clear();
//this.ColumnCount = table.Columns.Count + 1;
this.Columns.Add("sn", "sn");
this.Columns[0].Visible = false;
foreach (DataColumn col in table.Columns)
this.Columns.Add(col.ColumnName, col.ColumnName);
FillTableRow(table);
this.Visible = true;
}

public void AutosizeColumnsWidth()

{
this.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
foreach (DataGridViewColumn col in this.Columns)
col.Width = 12 * col.Name.Length + 32;
}//自动调整列宽

public void Export()

{

range#region range
int count = this.Columns.Count;

if (count > 256||count==0) return;//超出Excel的最大行数,或者为零

string cell = string.Empty;

int first = count / 26;
int second = count - (first * 26);

if (first > 1)

{
if (second > 0)
cell = ((char)(64 + first)).ToString() + ((char)(64 + second)).ToString();
else if (second == 0)
cell = ((char)(64 + first - 1)).ToString() + ((char)(90)).ToString();
else

{
MessageBox.Show("Interial Error", "Error Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
else if (first == 1)

{
if (second > 0)
cell = ((char)(64 + first)).ToString() + ((char)(64 + second)).ToString();
else if (second == 0)
cell = ((char)(90)).ToString();
else

{
MessageBox.Show("Interial Error", "Error Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
else if (first == 0)

{
cell = ((char)(64 + second)).ToString();
}
else

{
MessageBox.Show("Interial Error", "Error Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}

cell += "1";
#endregion


Start Excel#region Start Excel
Excel.Application app = new Excel.ApplicationClass();
if (app == null)

{
MessageBox.Show("Excel无法启动,请确认本机已经正确安装Microsoft Excel。","启动错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
app.Visible = false;
Excel.Workbooks wbs = app.Workbooks;
Excel.Workbook wb = wbs.Add(Missing.Value);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
#endregion

Excel.Range r = ws.get_Range("A1", cell); //MessageBox.Show(cell);
//r.Select();
r.NumberFormatLocal = "@";


header#region header
object[] objHeader = new object[this.Columns.Count];

foreach (DataGridViewColumn c in this.Columns)
objHeader[c.Index] = c.Name;
#endregion


write data#region write data
r.Value2 = objHeader;
if (this.Rows.Count > 1)

{
r = ws.get_Range("A2", Missing.Value);
object[,] objData = new Object[this.Rows.Count, this.Columns.Count];

for (int i = 0; i < this.Rows.Count - 1; i++)

{
foreach (DataGridViewColumn col in this.Columns)

{
if (this.Rows[i].Cells[col.Index].Value != null)
objData[i, col.Index] = this.Rows[i].Cells[col.Index].Value;
}
}
r = r.get_Resize(this.Rows.Count, this.Columns.Count);
r.Select(); //选中
r.NumberFormatLocal = "@"; //文本格式
r.Value2 = objData;
r.EntireColumn.AutoFit(); //自动调整列宽
r.HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter; //居中
}
#endregion
app.Visible = true;

}//导出到Microsoft Excel


///验证#region ///验证

private void CDataGrid_CellValidated(object sender, DataGridViewCellEventArgs e)

{
if (e.RowIndex == this.Rows.Count - 1) return;

if (CurrentCell.ReadOnly) return;//单元格只读,则返回


default value#region default value
if (CurrentCell.Value == null)//单元格为null

{
if (val_null) //允许为空

{
CurrentCell.ErrorText =string.Empty;
}
else//不允许为空

{
if (val_default != null)//默认值存在

{
CurrentCell.Value = val_default;
CurrentCell.ErrorText = string.Empty;
}//恢复为默认值

else //默认值不存在
CurrentCell.ErrorText = "内容尚未填充!";
}
return;//返回
}
#endregion


验证#region 验证
switch (val_type)

{
case DataMask.Num:

{
if (!Regex.IsMatch(CurrentCell.Value.ToString(), @"^([0-9]*)$"))
CurrentCell.ErrorText = "错误的数字格式";
else CurrentCell.ErrorText = String.Empty;
break;
}
case DataMask.Float:

{
if (!Regex.IsMatch(CurrentCell.Value.ToString().ToString(), @"^(-?"d+)("."d+)?$"))
CurrentCell.ErrorText = "错误的浮点数据格式";
else CurrentCell.ErrorText = String.Empty;
break;
}
case DataMask.Date:

{

if (!Regex.IsMatch(CurrentCell.Value.ToString().ToString(), @"^(?<month>(0?[1-9])|1[0-2])(-|/)(?<day>(0?[1-9])|((1|2)[0-9])|30|31)(-|/)(?<year>"d
{4})"))
CurrentCell.ErrorText = "数据格式: mm-dd-yyyy";
else CurrentCell.ErrorText = String.Empty;
break;
}
case DataMask.Bit:

{
if (CurrentCell.Value.ToString() != "1" && CurrentCell.Value.ToString() != "0")
this.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "错误的Bool格式";
else this.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = String.Empty;

break;
}
case DataMask.NvChar:

{
CurrentCell.ErrorText = String.Empty;
break;
}
default:

{
break;
}

}
#endregion


}

private void CDataGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e)

{

this.Rows[e.RowIndex].ErrorText = String.Empty;

} // Clear the row error in case the user presses ESC.
#endregion


///添加, 删除行#region ///添加, 删除行
private void CDataGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)

{
foreach (DataGridViewRow row in this.Rows)

{
row.Cells[0].Value = row.Index + 1;
}
}

private void CDataGrid_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)

{
foreach (DataGridViewRow row in this.Rows)

{
row.Cells[0].Value = row.Index + 1;
}
}
#endregion
}
posted on
2009-03-05 22:50
lgfcs
阅读(
352)
评论()
收藏
举报