使用DataGridView模拟Excel的计算汇总功能
效果如图1-3所示
图1-3
partial Class Form1:Form
{
public Form1()
{
InitializeComponent();
m_Grid.SelectionMode=DataGridViewSelectionMode.RowHeaderSelect;
}
Private void Form1_Load(object sender,EventArgs e)
{
ShowColumnHeader();
AddRow();
}
Private void ShowColumnHeader()
{
int start=(int)’A’;
for(int i=0;i<26;i++)
{
string colName=((char)(start+i)).ToString();
m_Grid.Columns.Add(colName,colName);
//两个参数分别为columnName,ColumnHeader
m_Grid.Columns[i].SortMode=ColumnSortMode.NotSortable;
m_Grid.Columns[i].Width=75;
}
}
private void AddRow()
{
for(int i=0;i<50;i++)
{
m_Grid.Rows.Add();
}
}
//当向DataGridView中添加行数据时发生
private void OnRowsAdded(object sender,DataGridViewRowEventArgs e)
{
m_Grid.Rows[e.RowIndex].HeaderCell.Value=e.RowIndex.ToString();
}
//当用户点击列标题的时候,可以通过事件来模拟用户选中整个列
private void m_Grid_ColumnHeaderMouseClick(object sender,DataGridViewCellMouseEventArgs e)
{
m_Grid.ClearSelection();
foreach(DataGridViewRow row in m_Grid.Rows)
{
row.Cell[e.ColumnIndex].Selected=true;
}
}
//用户点击获取计算功能
private void btnSum_Click(object sender,EventArgs e)
{
DataGridViewCellCollection selCells=m_Grid.SelectedCells;
if(selCells.Count<2)
return;
Dictionary<int,int> colSum=new Dictionary<int ,int>();
Dictionary<int ,int> rowSum=new Dictionary<int,int>();
foreach(DataGridViewCell cell in selCells)
{
if(!colSum.ContainsKeys(cell.columnIndex) )
{
if(cell.Value!=null && cell.Value.Tostring()!=string.Empty)
{
colSum[cell.ColumnIndex]=int.Parse(cell.Value.ToString());
}
}
else
{
if(cell.Value!=null && cell.Value.ToString()!=””)
colSum[cell.ColumnIndex]+=int.Parse(cell.Value.ToString());
}
if(!rowSum.ContainsKeys(cell.RowIndex)
{
if(cell.Value!=null && cell.Value.ToString()!=””)
rowSum[cell.RowIndex]=int.Parse(cell.Value.ToString());
}
else
{
if(cell.Value!=null && cell.Value.ToString()!=””)
rowSum[cell.RowIndex]+=int.Parse(cell.Value.ToString());
}
}
//获取最大行数和列数
int maxRow=0;
foreach(int i in rowSum.Keys)
{
if(i>maxRow)
maxRow=i;
}
int maxCol=0;
foreach(int j in colSum.Keys)
{
if(i>maxCol)
maxCol=j;
}
//下面是计算如图1-4所示
图1-4
if(rowSum.Keys.Count>=2)
{
foreach(int colIndex in colSum.Keys)
{
m_Grid.Rows[maxRow+1].cell[collIndex].value=cloSum[colIndex];
}
}
//下面是计算如图1-5所示
图1-5
if(colSum.Keys.Count>=2)
{
foreach(int rowIndex in rowSum.Keys)
{
m_Grid.Rows[rowIndex].Cells[maxCol+1].Value=rowSum[rowIndex];
}
}
}
}