今天写了个小工具,用到了datagirdview,还挺好使,现将操作记下来,方便以后查找(我这脑子不记东西,没办法)。
首先添加datagirdview控件,修改控件名称为dgv。
1. 动态加datagridview列标题
//指定列数
dgv.ColumnCount = m_lstFeather.Count + 1;
for (int i = 0; i < dgv.ColumnCount; ++i)
{
//指定列名
dgv.Columns[i].Name = m_lstFeather[i];
//按照指定的方式排序,这是为后面的实现点击标题可以排序做准备
dgv.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic;
}
2. 添加数据
添加数据,我今天遇到的,可分为两种方式,一是手动添加,也就是datagirdview可编辑,直接往里输数据;二是从剪贴板通过热键Ctrl+c复制数据到datagirdview。
第一种方式,很简单,就是保证datagirdview的readonly数据为false就可以了。
第二种方式,稍稍麻烦一些。见下面的代码,其中,dgv_KeyDown是datagirdview的KeyDown事件的绑定回调函数。
private void dgv_KeyDown(object sender, KeyEventArgs e)
{
//判断是否是ctrl+c的热键
if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.V)
{
//是否是在datagirdview控件上触发的
if (sender != null && sender.GetType() == typeof(DataGridView))
{
DataGirdViewCellPaste((DataGridView)sender);
}
}
}
public void DataGirdViewCellPaste(DataGridView p_Data)
{
// 获取剪切板的内容
string strPaste = Clipboard.GetText();
if (string.IsNullOrEmpty(strPaste))
{
return;
}
//按行分割
string[] strLines = strPaste.Split(new char[] { '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in strLines)
{
// 再按分隔符,分割列数据
string[] vals = line.Split(new char[]{'\t', ' ', ',', ',', ';', ';'}, StringSplitOptions.RemoveEmptyEntries);
p_Data.Rows.Add(vals);
}
}
3. 自动在每行前面生成索引
见下面的代码,dgv_RowPostPaint是datagirdview的RowPostPaint事件的绑定回调函数。
private void dgv_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
//自动编号,与数据无关
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rectangle, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
4. 点击表头排序
首先得设置要具备该功能的列标题的SortMode属性为 DataGridViewColumnSortMode.Programmatic(见1. 动态加datagridview列标题部分的代码)。然后添加如下代码,dgv_ColumnHeaderMouseClick是datagirdview的ColumnHeaderMouseClick事件的绑定回调函数。
private void dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (dgv.Columns[e.ColumnIndex].SortMode != DataGridViewColumnSortMode.Programmatic)
{
return;
}
switch (dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)
{//若没有排序,或者是降序,就按升序重排
case SortOrder.None:
case SortOrder.Descending:
dgv.Sort(dgv.Columns[e.ColumnIndex], ListSortDirection.Ascending);
dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
default://若是升序排列,就按降序重排
dgv.Sort(dgv.Columns[e.ColumnIndex], ListSortDirection.Descending);
dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
}
}
5. 设置滚动条到指定位置
通过CurrentCell 属性可设置滚动条的位置,如下,其中nRow和nCollumn就是指定位置的行和列的索引。
dgv.CurrentCell = dgv.Rows[nRow].Cells[nCollumn];