精华内容
下载资源
问答
  • datagridview winform

    2016-06-01 13:19:45
    image.fromfile(“@..\image\1.png”)错了吗 image.fromfile(“@..\image\1.png”)错了吗 private void Form1_... dataGridView1.Rows[0].Cells["Images"].Value = b.Image; 两种都报错
  • C#开发WinFormDataGridView开发

    万次阅读 多人点赞 2018-12-01 10:12:19
    dataGridView 禁止缩放单元格大小 2个属性 AllowUserToResizeColumns:禁止缩放列 AllowUserToResizeRows:禁止缩放行

    C#开发WinForm之DataGridView开发

    前言

    DataGridView是开发Winform的一个列表展示,类似于表格。学会下面的基本特征用法,再辅以经验,基本功能开发没问题。

    基本的数据渲染

    根据提供的数据展示出效果。
    提供给DataGridView数据源有很多方式,大致有如下三种:

    直接增加,每个单元格类型都是DataGridViewTextBoxCell

    int index=this.dataGridView1.Rows.Add();
    this.dataGridView1.Rows[index].Cells[0].Value = "1";
    this.dataGridView1.Rows[index].Cells[1].Value = "2";
    this.dataGridView1.Rows[index].Cells[2].Value = "3";
    

    直接增加一行,在行上的每天单元格内添加数据,缺点是太单一

    直接增加,但我们可以指定单元格类型

    DataGridViewRow row = new DataGridViewRow();
    DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
    textboxcell.Value = "aaa";
    row.Cells.Add(textboxcell);
    DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
    row.Cells.Add(comboxcell);
    dataGridView1.Rows.Add(row);
    

    可选的类型如下图:

    在这里插入图片描述

    使用vo对象

    上面2种都不是我想要的,因为列表展示的数据大部分情况下是复杂的后台回传的数据。所以我建议使用Vo。
    新建InfoVo.cs类

    public class InfoVo
        {
            /// <summary>
            /// 
            /// </summary>
            public string uidItem { get; set; }
            /// <summary>
            /// 
            /// </summary>
            public string uidItemRevision { get; set; }
            /// <summary>
            /// 
            /// </summary>
            public string primaryTag { get; set; }
     }
    

    构造一个List,将InfoVo放进List对象里,然后将List对象赋值给dataGridView.DataSource即可。
    在窗体的Load事件里添加如下代码

    private void SearchInfo_Load(object sender, EventArgs e)
            {
            	List<InfoVo> list = new List<InfoVo>();
                    list.Add(new InfoVo(){ uidItem="1", uidItemRevision ="1", primaryTag ="1"});
                    list.Add(new InfoVo(){ uidItem="2", uidItemRevision ="2", primaryTag ="2"});
                    dataGridView.AutoGenerateColumns = false;
                    dataGridView.DataSource = null;
                    dataGridView.DataSource = list;
            }
    

    直接赋值dataGridView.DataSource = list即可。这里的AutoGenerateColumns是禁止dataGridView自动根据vo属性创建列。

    在窗体上选中DataGridView,在属性面板里点击Columns选项。如下图
    在这里插入图片描述
    在打开的面板里,我们可以创建列。选择是否可见,设置抬头
    DataPropertyName:指定列绑定的数据源属性字段。
    在DolumnType里我们可以指定单元格类型,如下图
    在这里插入图片描述
    比如下拉框,或者单元框。
    至此,我们可以渲染出DataGridView组件里,下面看一些属性。

    dataGridView

    列宽自适应

    foreach (DataGridViewColumn column in dataGridView.Columns)
     {
         column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
     }
    
    成员名称说明
    NotSet列的大小调整行为从DataGridView.AutoSizeColumnsMode 属性继承。
    None列宽不会自动调整。
    AllCells调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。
    AllCellsExceptHeader调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。
    DisplayedCells调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。
    DisplayedCellsExceptHeader调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。
    ColumnHeader调整列宽,以适合列标题单元格的内容。
    Fill调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth属性值以上。相对列宽由相对DataGridViewColumn.FillWeight属性值决定。

    如果想让列宽能按比例填充显示区域则 column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    禁止缩放单元格大小

    2个属性
    AllowUserToResizeColumns:true:禁止缩放列
    AllowUserToResizeRows:true:禁止缩放行

    用户自定义列的顺序

    用户可以拖动的方式排序列展示
    AllowUserToOrderColumns:true

    是否可以编辑单元格

    1. 窗体的ReadOnlyfalse
    2. 在Columns弹出的列编辑窗口里,选择列的ReadOnlyfalse
    3. SelectionModeRowReadSelect(这是默认值)

    行头,列头不显示

    在属性面板里选中RowheadersVisible和ColumnHeadersVisible,置为false

    列表显示不完全,必需鼠标移到组件上才能显示的bug

    RowheadersVisible置为false即可。

    行头显示行号

    RowStateChanged事件添加监听,(在属性面板右边闪电图标下找)。

    private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
    {
        //显示在HeaderCell上
        for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
        {
            DataGridViewRow r = this.dataGridView1.Rows[i];
            r.HeaderCell.Value = string.Format("{0}", i + 1);
        }
        this.dataGridView1.Refresh();
    }
    

    行号没有完全显示出来的解决办法是将DataGridViewRowHeadersWidthSizeMode属性设置为AutoSizeToAllHeaders、AutoSizeToDisplayedHeaders或者AutoSizeToFirstHeader

    禁止自动创建列

    如果我们提供的vo对象,dataGrid会自动根据属性创建列,这不是我想要的,我希望能控制显示。如下设置即可
    dataGridView.AutoGenerateColumns = false;

    修改单元格类型

    单元格可以显示文件,也可以显示单元框,下拉框,图片和超链拉。只要在编辑列窗口里选择ColumnType下拉框,选择一下即可。当然选择的不同,数据设置不同,比如
    单选框DataGridViewCheckBoxColumn如下
    在这里插入图片描述

    下拉框DataGridViewComboBoxColumn
    在这里插入图片描述

    选中模式

    可以指定选中是整个行被选中还是每个小单元格被选中
    SelectionMode,全部可选如下
    在这里插入图片描述

    其它

    当然还有其它,只要我们熟悉,在属性面板上几乎都能找到。

    选中事件

    CellClick是选中事件,不用它即可,不要用CellContentClick,因为如果单元格无内容,这个CellContentClick事件不会触发。

    取得当前单元格内容 :DataGridView1.CurrentCell.Value
    取得当前单元格的列 Index:DataGridView1.CurrentCell.ColumnIndex
    取得当前单元格的行 Index:DataGridView1.CurrentCell.RowIndex
    取得当前行:dataGridView.CurrentRow;
    获得绑定的vo

    	     DataGridViewRow dataGridViewRow = dataGridView.CurrentRow;
                InfoVo infoVo = dataGridViewRow.DataBoundItem as InfoVo ;
                infoVo .uidItemRevision ;
    

    如果表格可编辑,那么编辑完表格会同步更新DataBoundItem绑定的vo对象

    遍历列表里所有单元格

    	foreach (DataGridViewRow item in dataGridView.Rows)
                {
                     //item是每行的对象,cells是单元格集合
                    if (null != item.Cells[0].Value && (Boolean)item.Cells[0].Value)
                    {
    			item.Cells[0].Value.toString();
    		}
    	}
    

    使用 DataGridView.CurrentCellAddress 属性(而不是直接访问单元格)来确定单元格所在的
    行: DataGridView.CurrentCellAddress.Y
    列: DataGridView.CurrentCellAddress.X 。

    当前的单元格可以通过设定 DataGridView 对象的 CurrentCell 来改变。可以通过 CurrentCell 来设定
    DataGridView 的激活单元格。将 CurrentCell 设为 Nothing(null) 可以取消激活的单元格。

    DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件

    正常响应CellValueChanged()事件时,当改变checkbox状态时,只有当焦点离开该单元格时才能触发CellValueChanged()事件,

    如果要改变checkbox值时实时触发CellValueChanged()事件,需要借用CurrentCellDirtyStateChanged()事件来提交未提交控件的更改。

    private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (dataGridView1.IsCurrentCellDirty)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
    

    事实上,当调用dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);时,就提交了当前的修改,很多其它事件都会有响应,其中CellValueChanged就是其中之一。
    这样CellValueChanged()事件就可以随着checkbox的值的改变实时触发。
    以全选/反选为例说明当DataGridViewCheckBoxColumn发生变化时怎么处理全选/反选。
    CheckBox有3种状态:选中(CheckState.Checked)/取消(CheckState.Unchecked)/部分选中(CheckState.Indeterminate)
    在winForm组件里拖拽一个CheckBox命名为selectAllCheckBox,Text为全选,拖拽一个LinkLabel命名为revSelectLinkLbl,Text为反选

     //全选
            private void selectAllCheckBox_CheckedChanged(object sender, EventArgs e)
            {
                CheckBox c = sender as CheckBox;
                if(c.CheckState == CheckState.Checked)
                {
                    ChangeDataSourceChecked(true);
                }
                else if(c.CheckState == CheckState.Unchecked)
                {
                    ChangeDataSourceChecked(false);
                }
            }
    
            private void ChangeDataSourceChecked(Boolean isSelected)
            {
                foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
                {
                    savePlmBomResponseVo.checkedC = isSelected;
                }
                dataGridView.DataSource = null;
                dataGridView.DataSource = dataSource;
            }
            /// <summary>
            /// 反选
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void revSelectLinkLbl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {
                if (this.selectAllCheckBox.CheckState == CheckState.Checked)
                {
                    this.selectAllCheckBox.CheckState = CheckState.Unchecked;
                }
                else if(this.selectAllCheckBox.CheckState == CheckState.Unchecked)
                {
                    this.selectAllCheckBox.CheckState = CheckState.Checked;
                }
                else
                {
                    //部分选中
                    foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
                    {
                        if (savePlmBomResponseVo.checkedC)
                        {
                            savePlmBomResponseVo.checkedC = false;
                        }
                        else
                        {
                            savePlmBomResponseVo.checkedC = true;
                        }
                    }
                    dataGridView.DataSource = null;
                    dataGridView.DataSource = dataSource;
                }
            }
    
            /// <summary>
            /// 处理DataSource数据变化时,全选/反选选中状态
            /// </summary>
            private void calSelectAllCheckBoxState()
            {
                int selectedCount = 0;
                foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
                {
                    if (savePlmBomResponseVo.checkedC)
                    {
                        ++selectedCount;
                    }
                }
                if (selectedCount == 0)
                {
                    if(this.selectAllCheckBox.CheckState != CheckState.Unchecked)
                    {
                        this.selectAllCheckBox.CheckState = CheckState.Unchecked;
                    }
                }
                else if (selectedCount == dataSource.Count)
                {
                    if (this.selectAllCheckBox.CheckState != CheckState.Checked)
                    {
                        this.selectAllCheckBox.CheckState = CheckState.Checked;
                    }
                }
                else
                {
                    if (this.selectAllCheckBox.CheckState != CheckState.Indeterminate)
                    {
                        this.selectAllCheckBox.CheckState = CheckState.Indeterminate;
                    }
                }
            }
    
            /// <summary>
            /// 提交修改状态
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void DataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (this.dataGridView.IsCurrentCellDirty)
                {
                    this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
    
            //行值变化
            private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                calSelectAllCheckBoxState();
            }
    
    展开全文
  • 最近项目中应用到 在一个主Datagridview嵌套另一个子DatagridView. 效果如下: 实现的思路: 在父 Datagridview 点击的当前行的下方,显示子Datagridview. //Step 1 private void Form_Load(object sender, ...

    最近项目中应用到 在一个主Datagridview嵌套另一个子DatagridView.
    效果如下:
    在这里插入图片描述
    在这里插入图片描述

    实现的思路: 在父 Datagridview 点击的当前行的下方,显示子Datagridview.

      //Step 1
            private void Form_Load(object sender, EventArgs e)
            {
                //dgv : Master grid
                //dataGridView1: Detail grid            
                dgv.Controls.Add(dataGridView1);
                dataGridView1.Visible = false;
            }
    
            //Step 2
            // text the rowheader of char '+' for each row in datagrid event: RowsAdded
            private void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                dgv.Rows[e.RowIndex].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
                dgv.Rows[e.RowIndex].HeaderCell.Value = "+";
            }
    
            //Step 3
            // set the position of the detail (sub) datagridview showing
            private void dgv_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {           
                dgv.CurrentRow.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
                dgv.CurrentRow.HeaderCell.Value = Convert.ToString(dgv.CurrentRow.HeaderCell.Value).Trim() == "+" ? "-" : "+"; // switch text the rowheader of char '+' or  '-'
    
                int scrollRowIndex = dgv.FirstDisplayedScrollingRowIndex; // the first  row in the top of the  datagrid
                if ((e.RowIndex - scrollRowIndex) > 10) // if the current row is the tenth row in the current page, set it to the top of the datagrid 
                {
                    dgv.FirstDisplayedScrollingRowIndex = e.RowIndex;
                }
                
                      //set the position of the detail (sub) datagridview"
                        System.Drawing.Rectangle rect = dgv.GetCellDisplayRectangle(-1, e.RowIndex  , false);
                        dataGridView1.Left = rect.Left;
                        dataGridView1.Top = rect.Bottom ;
                        dataGridView1.Width = dgv.Width ;
                        dataGridView1.Height = dgv.Height;
                        dataGridView1.Visible = Convert.ToString(dgv.CurrentRow.HeaderCell.Value).Trim() == "-" ? true : false; // show or hide the detail grid
            }
    
    展开全文
  • 有时候需要在设置表格的数据后,点击一下某列的表头进行排序,可以使用 this.dataGridView1.Sort(this.dataGridView1.Columns[2], ListSortDirection.Ascending); 相当于点击了第三列的表头进行排序。

    有时候需要在设置表格的数据后,点击一下某列的表头进行排序,可以使用

    this.dataGridView1.Sort(this.dataGridView1.Columns[2], ListSortDirection.Ascending);

    相当于点击了第三列的表头进行排序。

    展开全文
  • 本文主要介绍在DataGridView如何显示图片,简单实用,需要的朋友可以参考下。
  • 本文主要介绍在如何让DataGridView左侧显示图片,这里主要讲解重写DataGridView的OnRowPostPaint方法,需要的朋友可以参考下。
  • c#winform datagridview打印整个列表的例子,源码奉上
  • WinForm——DataGridView删除行

    千次阅读 2019-10-04 11:16:59
    问题:DataGridView表格显示删除行? 解决: foreach (DataGridViewRow dgvr in DGVHypo.SelectedRows){ this.DGVHypo.Rows.Remove(dgvr);} 这只是在DataGridView上删除行,不没有真正在数据库中删除。 转载于...

    问题:DataGridView表格显示删除行?

    解决:

    foreach (DataGridViewRow dgvr in DGVHypo.SelectedRows)
         {
                this.DGVHypo.Rows.Remove(dgvr);
          }

     

    这只是在DataGridView上删除行,不没有真正在数据库中删除。

    转载于:https://www.cnblogs.com/Delzl/archive/2011/07/03/2096762.html

    展开全文
  • C# Winform使用DataGridView的VirtualMode虚拟模式。 有两种数据类型作为DataGridView的数据源,一种是DataTable,一种是List。有不明白的,欢迎加微信交流:VPAmway。
  • 注:以下方法不止适合下拉框,单元格可以显示文件,也可以显示单选框,下拉框,图片和超链接等,只要创建对应的类型就可以,例如单选框:DataGridViewCheckBoxColumn 下面以下拉组合框为例: 首先创建一个ComboBox...
  • winform DataGridView表头带CheckBox全选;winform DataGridView表头带CheckBox全选
  • 代码如下: dgv.Rows[i].DefaultCellStyle.BackColor ... 代码如下:///  /// 隔行变色 ///  /// ”dgv”>传入DataGridView控件名称 public static void DgvRowColor(System.Windows.Forms.DataGridView dgv) { if
  • WinForm下编写分页控件,实现DataGridView的分页效果

    千次下载 热门讨论 2014-09-27 22:15:12
    WinForm下编写分页控件,实现DataGridView的分页查询效果。附带详细的注释,一看即会。另外也可直接复用。
  • C__WinForm开发系列_-_DataGridView.doc
  • winform设置DataGridView

    2019-11-23 14:48:42
    // 重新布局 dataGridView1.Location = new Point(0, 850); dataGridView1.Height = 200; // 调整列宽 dataGridView1.A...
  • 本控件经过我手动开发,使用效果不错,我的MES(订单管理系统分页的时候全部用的是这个控件,操作方便。)。里面有源码和DLL自己可以手动修改样式 还可以设置每页条数
  • dataGridView用来展示数据非常实用的控件,也介绍有对工具栏menuStrip的用法
  • 选择一列或者几列设置上述autosizemode=fill
  • dataGridView1.Rows.Add(); 添加行和多个数据 dataGridView1.Rows.Add("false","a,","b"); 添加行,数据为一个数组 dataGridView1.Rows.Add(string[] a); 添加泛型数据 dataGridView1.Rows.Add(xulie.ToArray());
  • WinFormDataGridView用法

    2020-07-20 19:39:38
    datagridview添加n行。 for(int i=0;i<n;i++) { i = dataGridView_detail.Rows.Add(); dataGridView_detail.Rows[i].Cells[0].Value = i+1; dataGridView_detail.Rows[i].Cells[1].Value = value[i]; } ...
  • //设置列表头 foreach (DataGridViewColumn headerCell in dataGridView1.Columns) { dt.Columns.Add(headerCell.HeaderText); } foreach (DataGridViewRow item in dataGridView1.Rows) { dr = dt.NewRow(); for ...
  • winform Excel读取数据到 DataGridView byte[] content; FileStream fs = File.OpenRead(open.FileName); content = new byte[fs.Length]; fs.Read(content, 0, content.Length); fs.Close(); string ...
  • 1、实现在DataGridView控件中添加进度条列,以进度条及白分比的方式在单元格中显示数据。 2、实现在进度条中显示进度百分比文本。
  • C#_winform_DataGridView_checkbox复选框_实现单选效果
  • C#的WinForm项目的dataGridView控件的CheckBox的全选、全不选、反选、单选、导出全部、仅导出已选择的项目到Excel的功能。简单明了,一看就懂。 我的腾讯微博:http://t.qq.com/djk8888
  • 主要介绍了winformdatagridview制作课程表的方法,实例分析了WinForm实现课程表的结构、数据库及调用技巧,需要的朋友可以参考下
  • C#winform datagridview 中显示HTML内容,方便进行富文本显示。
  • winform实现表头的多层,大于等于2层的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,832
精华内容 3,532
关键字:

datagridviewwinform