[ WinForm ]
-----------
DataGrid 中点击指定行标题或用 Select(n) 方法可以设置指定行的选中状态,并且可以多选,那么如何获取已选行的集合呢?或者对于某行,怎么知道其是否为已选状态?对每个热心参与回复者致谢!!

解决方案 »

  1.   

    可以用CurrentCell来获得当前选中的一行,集合就不是很清楚了
    已选状态,可以用 this.dataGrid1.IsSelected(?);
      

  2.   

    噢,原来真没注意 IsSelected 属性,但对于第一个问题总不至用循环来判断吧!数据量大时可是问题啊!
      

  3.   

    只有用一个循环了,dataGrid1.IsSelected() 为真时表示选中了如果是单选的,你只要判断CurrentCell读取行号或直接用dataGrid1.CurrentRowIndex读行数
      

  4.   

    用循环不行,性能肯定有问题,因为每次触发 CurrentCellChanged 事件时都需要获得已选行集合,另外,DataGrid 似乎不能设置单选,如何做才能更有效呢?
      

  5.   

    如果你用DataGrid只是显示数据的话,那么我建议你用DataReader去填充ListView,ListView里面能处理你的需求。
      

  6.   

    TO:ekin7913046(终结者) 
    当然不是,数据源来自从数据库中填充的DataSet...
      

  7.   

    //先算出总行数
    int i = this.mygrid.BindingContext[this.mygrid.DataSource, this.mygride.DataMember].Count;
    for(int j=0;j<i;j++)
    {
    if(this.mygrid.IsSelected(j))
    {
                  //在这里把选中的行加到你的集合里
                  //下面是去m行n例的数据  
                  myData = this.mygrid[m,n];
    }
    }
      

  8.   

    //显示选中的多行
    private void btnShowSelectedRow_Click(object sender, System.EventArgs e)
    {
    CurrencyManager currencyManager = (CurrencyManager)this.BindingContext[this.dataGrid1.DataSource,this.dataGrid1.DataMember];
    StringBuilder sb = new StringBuilder();
    for(int i = 0;i < dataGrid1.VisibleRowCount;i++)
    {
    if(this.dataGrid1.IsSelected(i))
    {
    DataRowView drv = (DataRowView)currencyManager.List[i];
    DataRow dr = drv.Row;
    sb.AppendFormat("{0} {1} {2}\n",dr[0],dr[1],dr[2]);
    }
    }
    //打印选择数据
    MessageBox.Show(sb.ToString());
    }
      

  9.   

    感谢“zhzuo(秋枫) ”,不过你的代码有些问题:1、VisibleRowCount 是当前可见行数,也就是用户区域显示出来的那部分,对“dataGrid1.VisibleRowCount”做循环,取值时却是从整个数据视图中按 VisibleRow 的索引取值,因为当 Visible 区域不能显示出所有数据行时并拖滚动条时,VisibleRow 的区域已经不一定对应的是数据集中的哪些行,对应关系不对,所以是取不到正确值的;2、取到的集合不是所有已选中的数据行集合,原因同上,当然这个性能是没什么大问题,但并不是问题的初衷;