求助:DataGridView中如何获取一次性选择多行的行号?

fengbingchun
博客专家认证
2012-11-19 04:08:52
DataGridView中有多行多列数据,一次性选中多行,如何获取选中行的行号和一共选中了多少行,
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
int k = dataGridView1.SelectedRows.Count;//总共选择的行数

if (e.Button == MouseButtons.Right)
{
MessageBox.Show(k.ToString());
}
}

用哪个Events呢?单一用MouseClick得到的结果总是0,为什么呢?
望高手指点,谢谢!
...全文
2336 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
atie458 2013-05-26
  • 打赏
  • 举报
回复

楼主的代码可以直接实现效果!请将SelectionMode属性设置为FullRowSelect
atie458 2013-05-26
  • 打赏
  • 举报
回复


楼主的代码效果可以直接实现,只需要将DataGridView的显示属性设置成正行显示的就行了
闪耀的瞬间 2012-11-20
  • 打赏
  • 举报
回复

我随便做了个列子,搞了嗲数据,用的是公司做好的GridView,大体和你的一样
以删除为例,我要删除这个列表中的一条数据,肯定要知道这一条数据的ID,也相当于行号吧,唯一
删除按钮触发JS方法getAll()
function getAll()
{
var items = document.getElementsByTagName("input");//这里checkbox在html里面已经转化成了input控件,获取所有的input也就是checkbox
var str=""; //定义一个变量,来接收ID(行号)
for(var i = 1;i < items.length; i++)//循环你获取的所有的checkbox的长度
{
if(items[i].id.indexOf("GridViewTable1_GridView1")!=-1 && items[i].type=="checkbox" && items[i].checked==true)//判断那个checkbox被选中
{
str+=","+items[i].value; //把被选中的用这个变量累加
}
}
if(str!="")
{
str=str.substring(1); //截取第一个 ","符号,得到所有的行号的数组
}
document.getElementById("hfListID").value=str; //保存到隐藏域中,
}
删除方法里面执行时,获取这个隐藏控件的值,是一个数组。。。循环取出每一个行号进行删除
fengbingchun 2012-11-20
  • 打赏
  • 举报
回复
引用 18 楼 zhuyu19911016520 的回复:
我随便做了个列子,搞了嗲数据,用的是公司做好的GridView,大体和你的一样 以删除为例,我要删除这个列表中的一条数据,肯定要知道这一条数据的ID,也相当于行号吧,唯一 删除按钮触发JS方法getAll() function getAll() { var items = document.getElementsBy……
谢谢!
八万英尺 2012-11-19
  • 打赏
  • 举报
回复
SelectionChanged事件里面写你的代码
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
我在DataGridView属性的Columns中Edit Columns中加人了一些列, 点击一个按钮,将数据在DataGridView中显示,按钮函数 private void 显示ToolStripMenuItem_Click(object sender, EventArgs e) { StreamReader streamReader = new StreamReader(@"ip_dx.txt", Encoding.Default, false); DataTable datatable = new DataTable(); 变量datatable如何获取到DataGridView的每列的列名呢(列名已在Edit Columns加入)?
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 13 楼 haukwong 的回复:
引用 9 楼 fengbingchun 的回复:引用 4 楼 gefangliang 的回复:C# code?1234 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) { ss = Convert.ToString(dataGridView1.SelectedRo……
谢谢!.RowIndex可以获取行号。
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 11 楼 gefangliang 的回复:
首先你要有行号啊,不然到哪里获取呢? C# code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546DataGridView显示行号的几种方法 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeader……
谢谢!
Hauk 2012-11-19
  • 打赏
  • 举报
回复 1
引用 9 楼 fengbingchun 的回复:
引用 4 楼 gefangliang 的回复:C# code?1234 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) { ss = Convert.ToString(dataGridView1.SelectedRows[i].Cells[0].Value); ……
            //this.dataGridView1.SelectedRows[0].Index
            foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
            {
                //选中行索引:row.Index
                //选中行取值:row.Cells[0]
            }
心灵彩虹 2012-11-19
  • 打赏
  • 举报
回复
DataGridView显示行号的几种方法

方法一:

网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号:


RowPostPaint 

       private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)        {            try            {                //添加行号                 SolidBrush v_SolidBrush = new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor);                int v_LineNo = 0;                v_LineNo = e.RowIndex + 1;                string v_Line = v_LineNo.ToString();                e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5);            }            catch (Exception ex)            {                MessageBox.Show("添加行号时发生错误,错误信息:" + ex.Message, "操作失败");            }        } 


 

但是这种方法在大数据量的时候性能比较差,每次滚动数据都会触发RowPostPaint事件。

 

 

方法二:

我的做法是给每行的HeaderCell赋值。

在网上发现有人提到这种做法,但是因为最后的显示问题而选择了上面的方法。具体问题就是,在行号超过2位,如100、1000,在选中该行时,DataGridView的行指示符▶会把行号往右挤,导致现实不全,100的时候显示▶ 10。

其实还是RowsHeaderWidth的大小有问题,将该列的宽度放大,行号显示的也没问题!

不知道他们有没有试过,上面绘制行号的方法在大行号的情况下显示也会有问题。

 

既然知道问题所在就要找到相应的解决方法。

具体做法是将DataGridView的RowsHeaderWidthSizeMode属性 设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号的情况了。

 

对于每次DataGridView的行变化,我们都去更新行号,用RowsAdded和RowsRemoved事件。

显示行号代码如下:


RowsAdded & RowsRemoved 

        private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)        {            for (int i = 0; i < e.RowCount; i++)            {                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();            }            for (int i = e.RowIndex + e.RowCount; i < this.DataGridView1.Rows.Count; i++)            {                this.DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();            }        }        private void DataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)        {            for (int i = 0; i < e.RowCount; i++)            {                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();            }            for (int i = e.RowIndex + e.RowCount; i < this.DataGridView1.Rows.Count; i++)            {                this.DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();            }        }
心灵彩虹 2012-11-19
  • 打赏
  • 举报
回复
首先你要有行号啊,不然到哪里获取呢?
DataGridView显示行号的几种方法

方法一:

网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号:


RowPostPaint 

       private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)        {            try            {                //添加行号                 SolidBrush v_SolidBrush = new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor);                int v_LineNo = 0;                v_LineNo = e.RowIndex + 1;                string v_Line = v_LineNo.ToString();                e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5);            }            catch (Exception ex)            {                MessageBox.Show("添加行号时发生错误,错误信息:" + ex.Message, "操作失败");            }        } 


 

但是这种方法在大数据量的时候性能比较差,每次滚动数据都会触发RowPostPaint事件。

 

 

方法二:

我的做法是给每行的HeaderCell赋值。

在网上发现有人提到这种做法,但是因为最后的显示问题而选择了上面的方法。具体问题就是,在行号超过2位,如100、1000,在选中该行时,DataGridView的行指示符▶会把行号往右挤,导致现实不全,100的时候显示▶ 10。

其实还是RowsHeaderWidth的大小有问题,将该列的宽度放大,行号显示的也没问题!

不知道他们有没有试过,上面绘制行号的方法在大行号的情况下显示也会有问题。

 

既然知道问题所在就要找到相应的解决方法。

具体做法是将DataGridView的RowsHeaderWidthSizeMode属性 设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号的情况了。

 

对于每次DataGridView的行变化,我们都去更新行号,用RowsAdded和RowsRemoved事件。

代码如下:


RowsAdded & RowsRemoved 

        private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)        {            for (int i = 0; i < e.RowCount; i++)            {                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();            }            for (int i = e.RowIndex + e.RowCount; i < this.DataGridView1.Rows.Count; i++)            {                this.DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();            }        }        private void DataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)        {            for (int i = 0; i < e.RowCount; i++)            {                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();            }            for (int i = e.RowIndex + e.RowCount; i < this.DataGridView1.Rows.Count; i++)            {                this.DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;                this.DataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();            }        }
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 6 楼 kongwei521 的回复:
datagridview.CurrentCell.RowIndex;是当前活动的单元格的行号 datagridview.SelectedRows 是选中行的集合 datagridview.SelectedColumns 是选中列的集合 datagridview.SelectedCells 是选中单元格的集合 DataGridView1.CurrentRow.In……
谢谢!
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 4 楼 gefangliang 的回复:
C# code?1234 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) { ss = Convert.ToString(dataGridView1.SelectedRows[i].Cells[0].Value); }
谢谢!试了试,能获取选中行的第一列的值,但是具体选中的是哪行改如何获取呢?
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 7 楼 haukwong 的回复:
SelectedRows要选中整行(点rowheader),才有效果。 或者设置dataGridView的SelectionMode=FullROwSelect
谢谢!已经将SelectionMode=FullROwSelect
Hauk 2012-11-19
  • 打赏
  • 举报
回复
SelectedRows要选中整行(点rowheader),才有效果。 或者设置dataGridView的SelectionMode=FullROwSelect
蝶恋花雨 2012-11-19
  • 打赏
  • 举报
回复
datagridview.CurrentCell.RowIndex;是当前活动的单元格的行号 datagridview.SelectedRows 是选中行的集合 datagridview.SelectedColumns 是选中列的集合 datagridview.SelectedCells 是选中单元格的集合 DataGridView1.CurrentRow.Index 获得包含当前单元格的行
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 3 楼 zhuyu19911016520 的回复:
用checkbox和JS就可以实现,用户选了多少行会这在checkbox里面勾上,把每行的ID放到这个checkbox的value中,用JS获取所有checkbox,用循环,循环这个数组,如果是checkbox[i].type=="checkbox"(表示勾上的),checkbox[i].value就差不多出来了
谢谢!checkbox 和 JS?可以详细点吗
心灵彩虹 2012-11-19
  • 打赏
  • 举报
回复

 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) {
                ss = Convert.ToString(dataGridView1.SelectedRows[i].Cells[0].Value);
            } 
闪耀的瞬间 2012-11-19
  • 打赏
  • 举报
回复
用checkbox和JS就可以实现,用户选了多少行会这在checkbox里面勾上,把每行的ID放到这个checkbox的value中,用JS获取所有checkbox,用循环,循环这个数组,如果是checkbox[i].type=="checkbox"(表示勾上的),checkbox[i].value就差不多出来了
fengbingchun 2012-11-19
  • 打赏
  • 举报
回复
引用 1 楼 kunkun0921 的回复:
这个count总是0是因为你使用的事件不对,你在Button的Click事件里面去获取就不是0了,
谢谢!但是只能在DataGridView上进行操作,不能添加额外的按钮,是不是选择其它事件还是几个事件的结合才能实现呢?
加载更多回复(1)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧