datagridview明细
调用datagridviewEx所需要的条件:
在program中加入这一句:
  SqlSugarServices.SetConnectionString("server=131.98.64.174,3332;database=v33_hy;uid=fyf;pwd=9776");
--在窗口的初始化事件中编写
dataGridViewEx2.SetColRelate("fyf", MethodBase.GetCurrentMethod().DeclaringType.FullName, "dataGridViewEx1", "0"); //把参数传入DataGridViewEx中 最后的“0“是为了多一个有可能用得上的分别
//================================== 设置扩展datagridview需要这一堆(始) =============
dataGridViewEx2.DataSource = null;
BindingSource bs = new BindingSource();
DataTable dt = new Class().getClass();
bs.DataSource = dt;
dataGridViewEx2.DataMember = new Class().getClass().TableName;
//dataGridViewEx2.DataSource = new Class().getClass();
dataGridViewEx2.DataSource = bs;
dataGridViewEx2.bds1 = bs;
//================================== 设置扩展datagridview需要这一堆(完) =============
- c# winform datagridview 表头居中设置
//整表居中
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
 
//某一列居中
DataGridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
 
//设置列不可排序
DataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
- 
C# DataGridView控件自动列宽后手动调整列宽 
 DgvBillDetail.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
- 
dataGridView控件获取当前鼠标所在的行 
点击查看代码
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
     //获取行列坐标索引
     //方法一:
     //int row = e.RowIndex+1;
     //int col = e.ColumnIndex+1;
 
     //方法二:
     //int row = dataGridView1.CurrentCell.RowIndex + 1;
     //int col = dataGridView1.CurrentCell.ColumnIndex + 1;
 
     //方法三:
     //int row = dataGridView1.CurrentCellAddress.Y + 1;
     int col=dataGridView1.CurrentCellAddress.X+1;
 
     //方法四:
     int row = dataGridView1.CurrentRow.Index + 1;
             
     //获取当前单元格内容
     //方法1:
 
     // string cell = dataGridView1.Rows[row-1].Cells[col-1].Value.ToString();
 
     //方式2:
     string cell = dataGridView1.CurrentCell.Value.ToString();
 
     MessageBox.Show("点击:"+row+"行;"+col+"列内容是:"+cell);
}
- EditedFormattedValue和Value的区别
 EditedFormattedValue:在编辑过程中设置和显示的值,还没有提交给Value,如在一个cell中录入数据的时候,每键入一个字符都会触发CellEditedFormattedValueChanged事件,但不会触发CellValueChanged事件,之后Commit之后才会触发CellValueChanged。
 Value:编辑提交之后,根据EditedFormattedValue的值设置Value的值。
 以上两个值在某些时候可以不相等。
转载于:https://www.cnblogs.com/hanje/p/11016074.html
- 
c# DataGridView查找搜索的实现(做在C#考勤机的登记指纹的最后面)
- 3.查看是否有选中行
// 表示有选中行
if(skinDataGridView1.CurrentRow != null){}
// 获取当前选中行索引
int currentIndex = skinDataGridView1.CurrentRow.Index;
- 5.某列禁止用户编辑
// 设置第4列禁止编辑
skinDataGridView1.Columns[3].ReadOnly = true;
//修改指定列名的颜色
 DataGridView1.EnableHeadersVisualStyles = false;//需要
 DataGridView1.Columns[0].HeaderCell.Style.BackColor = Color.Blue;
 //DataGridView1.Columns[i] i写你想要的列号就可以了
//修改指定列的颜色
 DataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.LightGreen;//列间隔变色
 //DataGridView1.Columns[i] i写你想要的列号就可以了
- 6.DataGridView基本操作
DataGridView的几个基本操作:
1、获得某个(指定的)单元格的值:
dataGridView1.Row[i].Cells[j].Value;
2、获得选中的总行数:
dataGridView1.SelectedRows.Count;
3、获得当前选中行的索引:
dataGridView1.CurrentRow.Index;
4、获得当前选中单元格的值:
dataGridView1.CurrentCell.Value;
5、取选中行的数据
string[] str = new string[dataGridView.Rows.Count];
for(int i;i
{
  if(dataGridView1.Rows[i].Selected == true)
  {
    str[i] = dataGridView1.Rows[i].Cells[1].Value.ToString();
  }
}
6、获取选中行的某个数据
int a = dataGridView1.SelectedRows.Index;
dataGridView1.Rows[a].Cells["你想要的某一列的索引,想要几就写几"].Value;
获得某个(指定的)单元格的值: dataGridView1.Row[i].Cells[j].Value; Row[i] 应该是Rows[i]
int a=dataGridView1.CurrentRow.Index;
string str=dataGridView1.Row[a].Cells["strName"].Value.Tostring();
selectedRows[0]当前选中的行
.cell[列索引].values 就是当前选中行的某个单元格的值 
DataGridView1.SelectedCells(0).Value.ToString 取当前选择单元内容
DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString 当前选择单元第N列内容
- C#中DataGridView控件鼠标点击选中行的问题
 以下所有事件都是dataGridView的事件。
 1、CellClick:在单元格内按下并在同一个单元格内弹起鼠标左键;
 2、CellMouseDown:在单元格按下鼠标左键(或右键)时触发;
 3、CellMouseUp:在单元格上弹起左键或右键;
 4、MouseDown:鼠标在DataGridView控件上按下鼠标左键或右键;
 5、MouseUp:当DataGridView的MouseDown事件触发后无论鼠标在什么位置弹起都触发该事件。
1、右键不选中任何行也不改变当前的SelectedRows中的值。
2、当在DataGridView中Cell(最上一行的列标题行除外)中按下左键时只有鼠标弹起的时候(可以在其他任意位置弹起)才改变SelectedRows。这时候会把按下鼠标左键的行选中或添加到选中行集合。
3、当在列标题所处的行按下左键时并弹起(任意位置)时,SelectedRows不发生改变。
- c#中DataGridView 如何设置 才能选中一行 设置鼠标事件
private void dataGridViewQQGloup_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridViewQQGloup.Rows[dataGridViewQQGloup.CurrentCell.RowIndex].Selected = true;
}
private void dataGridViewQQGloup_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridViewQQGloup.Rows[dataGridViewQQGloup.CurrentCell.RowIndex].Selected = true;
}
private void dataGridViewQQGloup_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridViewQQGloup.Rows[dataGridViewQQGloup.CurrentCell.RowIndex].Selected = true;
}
DataGridView 列宽设置 (转自https://blog.csdn.net/woguyanli/article/details/6650500)
今天有个需求,要把数据显示在一个DataGridView中,为了美观,希望列宽可以只适应内容。
本想着如果实在没办法,就自己写代码实现了,没想到人家自己就提供了简便的方法。
就一行代码:
Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
这就搞定了,效果就是列宽会根据内容以及表头宽度自行判断,最后调整到合适的宽度。
2010-05-28 补充
AutoSizeMode这个属性并不显示在“属性”窗口中。
如果你的DataGridView是动态绑定数据的,
那就只能在代码中设置。
如果你的DataGridView列名是设计好的,那么可以在DataGridView上点击右键,选择“编辑列”,然后选中你要设置自适应的列,在它的属性列表中的“布局”选项卡里面选择AutoSizeMode的类型。
AutoSizeMode属性可以设置的值还有不少:
成员名称 说明
NotSet  列的大小调整行为从DataGridView.AutoSizeColumnsMode 属性继承。
None  列宽不会自动调整。
AllCells  调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。
AllCellsExceptHeader  调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。
DisplayedCells  调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。
DisplayedCellsExceptHeader  调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。
ColumnHeader  调整列宽,以适合列标题单元格的内容。
Fill  调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth属性值以上。相对列宽由相对DataGridViewColumn.FillWeight属性值决定。
另外介绍:
DataGridView
有一个属性是AutoSizeColumnMode,他有几个枚举值:
1、AllCells 调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。
2、AllCellsExceptHeader 调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。
3、ColumnHeader 调整列宽,以适合列标题单元格的内容。
4、DisplayedCells 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。
5、DisplayedCellsExceptHeader 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。
6、Fill 调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth 属性值以上。相对列宽由相对 DataGridViewColumn.FillWeight 属性值决定。
7、None 列宽不会自动调整。
8、NotSet 列的大小调整行为从 DataGridView.AutoSizeColumnsMode 属性继承。
注:如果想要自动设置列宽.在这里就必须把DataGridView的值设置为Fill
 this.dataGridView.DataSource = ds.Tables[0];
 this.dataGridView.Columns[0].FillWeight = 10;      //第一列的相对宽度为10%
 this.dataGridView.Columns[1].FillWeight = 20;      //第二列的相对宽度为20%
 this.dataGridView.Columns[2].FillWeight = 30;      //第三列的相对宽度为30%
 这里的值是相对于DataGridView当前的总宽度的,所以窗体最大化和缩小的效果是不一样的,但比例不变
注:如何给每列设置标头
设置标题字段(先把ColumnsHeadersVisible设置为true)
this.dataGridView.Columns[0].HeaderText = "编号";
this.dataGridView.Columns[1].HeaderText = "日期";
this.dataGridView.Columns[2].HeaderText = "标题";
- 选定指定行:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
	var ch = dataGridView1.Rows[i].Cells["ch"].EditedFormattedValue.ToString();
	if (dataGridView1.Rows[i].Cells["ch"].EditedFormattedValue.ToString() == "True")
	{
		dataGridView1.ClearSelection();
		dataGridView1.Rows[i].Selected = true;
		//让指定行处于选中状态(状态)
		dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[1];
		dataGridView1.CurrentRow.Selected = true;
		string sUserID = dataGridView1.Rows[i].Cells["userid"].Value.ToString();
		iMachineNumber = Convert.ToInt32(this.txtMachineNum.Text.Trim());
		UpLoad(iMachineNumber, sUserID);
	}
}
C#中DataGridView控件的行头显示序号的宽度适中
控件添加如下事件即可在*号那个位置显示序号:
//datagridview添加行号
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
    e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString();
}
具体做法是将DataGridView的RowsHeaderWidthSizeMode属性设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号的情况了。
使用实例
在本使用中,我们建议了一个DataGridView 的实例 dgv。然后在编辑时,判断单元格的数据是否是数字。对以下三种情况进行处理:
数字字符串:则自动跳到下一行,方便用户继续编辑;
空字符串:退出编辑模式,继续停留在当前单元格;
其他字符串:弹出对话框报错,然后重新进入当前单元格的编辑。
private void Dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    string value = dgv[e.ColumnIndex, e.RowIndex].Value?.ToString();
    // 值为空时,只退出编辑模式,不做任何操作。
    if (string.IsNullOrEmpty(value))  
    {
        Console.WriteLine("value is null or empty."); 
    }
    // 如果能转换,则移动到下一行。
    else if (double.TryParse(value, out double result))
    {
        dgv.CurrentCell = dgv[e.ColumnIndex, e.RowIndex + 1];
    }
    // 如果不能转换为数字,则弹出对话框,然后继续进入编辑模式。
    else
    {
        MessageBox.Show("字符串格式不正确。");
        dgv.BeginEdit(true);
    }
}
DataGridView控件页脚会总行的最佳实现
大家一致在讨论如何做一个DataGridView控件汇总的行在最末,有的自己加上一行,把最后一行覆盖掉,有的在控件外部空间加上汇总的信息,都不是最佳的解决方案。
找到了一个老外的网址,才发现和人家比,我们还是有差距的。http://www.dotnetmonster.com/Uwe/Forum.aspx/winform-data-binding/1245/DataGridView-Summary-Row
用这个思路来解决DataGridView汇总行的问题,非常不错,排序等操作也不会影响最后一行,我梢后会扩展到以前发布的控件DataGridViewEx内http://download.csdn.net/detail/ireenter/3407133 ,到时分享给大家。
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
       ///原文没有,但必需增加上。
     this.dataGridView1.AllowUserToAddRows = true;
     int sum = 0;
   // only draw the cells of the extra row by ourselves, leaving the rest cells to the system
   if (e.RowIndex == this.dataGridView1.NewRowIndex && e.ColumnIndex > -1)
   {           
       for (int i = 0; i < this.dataGridView1.NewRowIndex; i++)
       {
            if (this.dataGridView1.Rows[i].Cells[e.ColumnIndex].Value.ToString().Trim() != "")
           {
               sum += (int)this.dataGridView1.Rows[i].Cells[e.ColumnIndex].Value;
            }
       }
       e.PaintBackground(e.CellBounds, false);
       e.Graphics.DrawString(sum.ToString(), this.dataGridView1.Font, Brushes.Black, e.CellBounds.Left + 2,e.CellBounds.Top + 2);
       e.Handled = true;
   }
}
datagridview 简单的添加合计行
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells[0].Value = "XYZ";
row.Cells[1].Value = 50.2;
yourDataGridView.Rows.Add(row);
DataGridView实现添加合计行并始终显示在底部
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
public class DataGridViewSumRow
{
    private DataTable dt;
    private DataTable dtSum;
    private int ROW_HEIGHT = 21; // '行高
    private void DataGridViewSumRow_Load(System.Object sender, System.EventArgs e)
    {
        VScrollBar1.Visible = false;
    }
    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        dt = GetData();
        this.DataGridView1.DataSource = dt;
        this.DataGridView1.RowTemplate.Height = ROW_HEIGHT;
        GetSumData();
        // '行数超过当前页显示时显示纵向滚动条
        if (dt.Rows.Count > 13)
        {
            VScrollBar1.Visible = true;
            // '总长度为 (所有行数 - 画面一页显示行数) × 行高
            VScrollBar1.Maximum = (this.DataGridView1.Rows.Count - this.DataGridView1.DisplayedRowCount(false)) * ROW_HEIGHT;
            VScrollBar1.Minimum = 0;
            VScrollBar1.SmallChange = 21;
            VScrollBar1.LargeChange = 50;
        }
    }
    /// <summary>
    ///     ''' 合计取得设定
    ///     ''' </summary>
    ///     ''' <remarks></remarks>
    private void GetSumData()
    {
        DataRow dr;
        dtSum = new DataTable("TEST");
        dtSum = dt.Clone;
        Random rdm = new Random();
        dr = dtSum.NewRow();
        dr(0) = "合计";
        for (int i = 1; i <= dt.Columns.Count - 1; i++)
            dr(i) = dt.Compute("Sum(" + dt.Columns(i).ColumnName + ")", "true");
        dtSum.Rows.Add(dr);
        this.DataGridViewSum.DataSource = dtSum;
        this.DataGridViewSum.Rows(0).DefaultCellStyle.BackColor = Color.Brown;
        this.DataGridViewSum.ReadOnly = true;
        this.DataGridViewSum.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    }
    /// <summary>
    ///     ''' 数据取得
    ///     ''' </summary>
    ///     ''' <returns></returns>
    ///     ''' <remarks></remarks>
    public DataTable GetData()
    {
        DataTable dt;
        DataRow dr;
        dt = new DataTable("TEST");
        dt.Columns.Add(new DataColumn("号码", typeof(string)));
        dt.Columns.Add(new DataColumn("数量1", typeof(int)));
        dt.Columns.Add(new DataColumn("数量2", typeof(int)));
        dt.Columns.Add(new DataColumn("数量3", typeof(int)));
        dt.Columns.Add(new DataColumn("数量4", typeof(int)));
        dt.Columns.Add(new DataColumn("数量5", typeof(int)));
        dt.Columns.Add(new DataColumn("数量6", typeof(int)));
        dt.Columns.Add(new DataColumn("数量7", typeof(int)));
        dt.Columns.Add(new DataColumn("数量8", typeof(int)));
        dt.Columns.Add(new DataColumn("数量9", typeof(int)));
        Random rdm = new Random();
        for (int i = 10; i <= 80; i++)
        {
            dr = dt.NewRow();
            dr(0) = "00" + i.ToString();
            for (int j = 1; j <= 9; j++)
                dr(j) = rdm.Next(1000, 5000);
            dt.Rows.Add(dr);
        }
        return dt;
    }
    /// <summary>
    ///     ''' 纵滚动条事件
    ///     ''' </summary>
    ///     ''' <param name="sender"></param>
    ///     ''' <param name="e"></param>
    ///     ''' <remarks></remarks>
    private void VScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
    {
        // Debug.WriteLine(e.NewValue.ToString)
        this.DataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue;  /* TODO ERROR: Skipped SkippedTokensTrivia */
    }
    private void Button2_Click(System.Object sender, System.EventArgs e)
    {
        this.Close();
    }
    /// <summary>
    ///     ''' 合计DataGridView的滚动条事件
    ///     ''' </summary>
    ///     ''' <param name="sender"></param>
    ///     ''' <param name="e"></param>
    ///     ''' <remarks></remarks>
    private void DataGridViewSum_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
    {
        this.DataGridView1.HorizontalScrollingOffset = e.NewValue;
    }
    /// <summary>
    ///     ''' 数据变更后重新合计
    ///     ''' </summary>
    ///     ''' <param name="sender"></param>
    ///     ''' <param name="e"></param>
    ///     ''' <remarks></remarks>
    private void DataGridView1_CellValueChanged(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex <= 0)
            return;
        // 'DetaGridView中数据变化后重新合计
        this.DataGridViewSum(e.ColumnIndex, 0).Value = dt.Compute("Sum(" + dt.Columns(e.ColumnIndex).ColumnName + ")", "true");
    }
    /// <summary>
    ///     ''' 响应鼠标滚轴事件
    ///     ''' </summary>
    ///     ''' <param name="sender"></param>
    ///     ''' <param name="e"></param>
    ///     ''' <remarks></remarks>
    private void DataGridViewSumRow_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (VScrollBar1.Visible == false)
            return;
        if (VScrollBar1.Value - ROW_HEIGHT < 0 & e.Delta > 0)
        {
            VScrollBar1.Value = VScrollBar1.Minimum;
            return;
        }
        if (VScrollBar1.Value + ROW_HEIGHT > VScrollBar1.Maximum & e.Delta < 0)
        {
            VScrollBar1.Value = VScrollBar1.Maximum;
            return;
        }
        try
        {
            VScrollBar1.Value -= System.Convert.ToInt32(e.Delta / (double)Math.Abs(e.Delta) * ROW_HEIGHT);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("###########################");
            Debug.WriteLine("VScrollBar1.Value = " + VScrollBar1.Value);
            Debug.WriteLine("e.Delta = " + e.Delta);
            Debug.WriteLine("###########################");
        }
        this.DataGridView1.FirstDisplayedScrollingRowIndex = VScrollBar1.Value;  /* TODO ERROR: Skipped SkippedTokensTrivia */
    }
}
dataGridView的事件DataBindingComplete触发多次原因
原文链接:https://blog.csdn.net/jochzhu/article/details/79270302
dataGridView绑定datatable ,结果事件DataBindingComplete
经过测试发现
DataTable dt = new DataTable("joch");
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
        dt.Rows.Add(1, 1, 1);
        dt.Rows.Add(2, 2, 5);
        dt.Rows.Add(3, 3, 4);
//this.dataGridView1.DataMember = dt.TableName;
//第二次会出错
if (this.dataGridView1.DataSource ==null)
{
this.dataGridView1.DataMember = dt.TableName;
}
this.dataGridView1.DataSource = dt;
上面2行代码切记不可调换顺序.
就可以避免触发多次.
原因可能是datasource绑定后或自动再次修改datamember的值 导致多次DataBindingComplete事件
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号