C#,Winform, DataGridView,应用技巧

2019-09-11 更新
1、有时不希望DataGridView显示不要显示的数据 2018-04-04 解决方法 取消DataGridView自动生成列  dataGridView1.AutoGenerateColumns = false;


2、DataGridView添加 行、列  2018-04-04
//增加一个列
DataGridViewColumn c = new DataGridViewColumn();
dgv.Columns.Add(c);
//增加行
int i = dgv.Rows.Add();
DataGridViewRow r = dgv.Rows[i];
//r就是你新增的行
3、DataGridView固定某列/锁定列   20180409
DataGridView1.Columns[0].Frozen=true;


4、自动增加显示行数 2018-11-27更新
//原创来自http://www.luofenming.com/show.aspx?id=ART2018012500001
//在dataGridView赋值后再运行这代码
//或者注册事件里面加这个
int rowNumber = 1;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
 if (row.IsNewRow) continue;
 row.HeaderCell.Value = "" + rowNumber;
rowNumber = rowNumber + 1;
}
5、间隔一行,颜色变的不一样 、设置每一列都不允许排序2018-11-27更新
//在dataGridView赋值后再运行这代码
//或者注册事件里面加这个
//间隔一行,颜色变的不一样
for (int i = 1; i < dataGridView1.Rows.Count - 1; i = i + 2)
{
    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.LightGray;
}
//设置每一列都不允许排序
for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
{
    this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}


6、控制dataGridView 光标上下移动选中行,并且滚动条也跟着移动 也可以移动到指定的行 2019-03-27更新

效果如下图

以下是核心代码

        /// <summary>
        ///选中行 光标也移到选中行 
        /// </summary>
        /// <param name="dataGridView"></param>
        /// <param name="index">指定的行号</param>
        private void DataGridViewMorve(DataGridView dataGridView, int index)
        {
            if (dataGridView != null && dataGridView.Rows.Count > index && dataGridView.Rows[0].Cells.Count > 0 && index >= 0)
            {
                dataGridView.CurrentCell = dataGridView.Rows[index].Cells[0];
                dataGridView.Rows[index].Selected = true;
            }
        }
        int index = 0;
        //调用方法 下移
        private void button1_Click(object sender, EventArgs e)
        {
            if (index < dataGridView1.Rows.Count-1)
            {
                index++;
                DataGridViewMorve(dataGridView1, index);
            }
        }
        //调用方法 上移
        private void button2_Click(object sender, EventArgs e)
        {
            if (index > 0)
            {
                index--;
                DataGridViewMorve(dataGridView1, index);
            }
        }


7、DataGridView 下拉菜单(ComboBox)绑定数据    2019-04-03

核心代码如下

DataGridViewComboBoxColumn colPortName = (DataGridViewComboBoxColumn)dataGridView1.Columns["Column1"];
string[] serialName = new string[] { "aaa1", "bbb2", "ccc3" };
colPortName.DataSource = serialName;


8、给正在编辑的DataGridView中的DataGridViewCell赋值问题 2019-04-07
给正在编辑通过代码直接赋值没反应,解决办法的核心代码如下
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {//有时想把回车功能换掉其它换行  也可以做到,如不知道keys对应的值可以仿真查看
            if (keyData == Keys.Oemplus)//当输入 = 时赋值
            {
                dataGridView1.CurrentCell.ReadOnly = true;
                dataGridView1.CurrentCell.Value = "333";//给当前的DataGridViewCell赋值
                dataGridView1.CurrentCell.ReadOnly = false;
                return true;
            }
            return false;
        }


9、dataGridView在尾行动态添加一行  核心代码如下   2019-04-09
DataGridViewRow row = new DataGridViewRow();
DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
textboxcell.Value = "";
row.Cells.Add(textboxcell);
dataGridView1.Rows.Add(row);


10、当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。 核心代码如下 2019-04-10
DataTable tempTable =  (DataTable)dataGridView1.DataSource; 
tempTable.Rows.Add("1111");//如果第一列是DataGridViewComboBoxCell时并且绑定了数据时 一定要是Items里面的一项
DataTable d2 = tempTable.Clone();
dataGridView1.DataSource = d2;
foreach (DataRow dr in tempTable.Rows)
{
    d2.Rows.Add(dr.ItemArray);
}
dataGridView1.DataSource = d2;
dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex + 1].Cells[0];//当前行为最后一行的第一列

11、禁用dataGridview行和列拖动变大 2019-09-11
this.dataGridView1.AllowUserToResizeColumns = false;
this.dataGridView1.AllowUserToResizeRows = false;