如果得到DataGrid的当前选择行对应的DataRow ??

foxbuilder 2005-09-26 10:29:11
现在我用下面的这种方法: DTQuery.Rows(Me.DataGridBook.CurrentRowIndex),但如果DataGrid排序后,顺便就乱了.
...全文
1521 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxbuilder 2005-10-07
  • 打赏
  • 举报
回复
mkjordan的方法就是我想要的, 得到DataRowView后取它的Row即是当前的DataRow


Dim myBind As BindingManagerBase

Private Sub RefreshRecord()
DTQuery.TableName = "QueryResult"
Me.DataGridBook.DataSource = DTQuery.DataSet
Me.DataGridBook.DataMember = "QueryResult"
myBind = Me.BindingContext(Me.DTQuery.DataSet, "QueryResult")
End Sub



Private sub GetCurrent()
Dim dv As DataRowView = myBind.Current
Dim dr As DataRow = dv.Row '得到当前的datarow
MsgBox(dr.Item("ItemNo"))
End Sub
KahnWinsock 2005-09-26
  • 打赏
  • 举报
回复
用datatable作datagrid的datasource,datagrid中行号与datatable对应。取到datagrid的行号,就可以找到datarow了,用datatable的row(i)。
ganyuclok 2005-09-26
  • 打赏
  • 举报
回复
Private Sub DataGrid1_MouseDown1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGrid1.MouseDown
Dim myGrid As DataGrid = CType(sender, DataGrid)
Dim hti As System.Windows.Forms.DataGrid.HitTestInfo
hti = myGrid.HitTest(e.X, e.Y)
Dim rowNum, columnNum, j As Integer

If e.Button = MouseButtons.Right And e.Clicks = 1 Then '如果是鼠标右击
' MsgBox("1")
Select Case hti.Type '
Case System.Windows.Forms.DataGrid.HitTestType.Cell, System.Windows.Forms.DataGrid.HitTestType.RowHeader, System.Windows.Forms.DataGrid.HitTestType.ColumnHeader

rowNum = hti.Row '获得鼠标右击所在行
columnNum = hti.Column '获得鼠标右击所在列

Dim mytable As New DataTable
mytable = ds.Tables(0) '表的数据源

Dim i As Int16
i = 0
For i = 0 To mytable.Rows.Count - 1
If mytable.Rows(i).Item(0) = Me.DataGrid1.Item(hti.Row, 0) Then
j = i '最终列号 j
End If
Next
End Select
End If
End Sub
End Class
我是这样做的,因为排序后列会乱。我在表了加了一个自增的ID字段,因为是唯一的写了一个循环
得到最终列号。
rowNum的获得方法很多,但是排序后会乱,寻求更好的解决方法。
foxbuilder 2005-09-26
  • 打赏
  • 举报
回复
取值是没问题的. 但要我得到的是DataRow
sz_lgp 2005-09-26
  • 打赏
  • 举报
回复
同意楼上的。
zssd_039 2005-09-26
  • 打赏
  • 举报
回复
Dim rowNum As Int32 = Me.DataGridBook.CurrentRowIndex
misiacat 2005-09-26
  • 打赏
  • 举报
回复
那篇文章我看过好几回了,我就是用的上面的for each 。。。next得到index的。

青铄,这样如果datagridview排序后,如果在当前选中行插入记录的话还是会出现混乱的呀~
misiacat 2005-09-26
  • 打赏
  • 举报
回复
谢谢青铄,
我觉得直接定义DataRow的实例就行了吧?
我的QQ:5010814 能加我么?
weisai 2005-09-26
  • 打赏
  • 举报
回复
1. DataGrid要绑定到dataview
2. dim RowIndex as integer = Me.BindingContext(dv).Position
3. dim objRow as datarow = Me.objDvUnSuitReport.Item(RowIndex).Row

无论你怎么排序,都能找到当前选择行对应的DataRow
Tsingli 2005-09-26
  • 打赏
  • 举报
回复
to misiacat(陈梦飞):
你理解错了,“DataRow[]就是DataRow的数组”,说白了,DataRow[]就是一组DataRow。
DataRow是构成DataTable的数据行啊!2003也是这样的啊。
要得到选中行的index,只要用DataGridView.CurrentRow.Index就行了啊!
这里有关于DataGridView的详细介绍:
http://www.microsoft.com/china/msdn/library/langtool/vsdotnet/vs05a9.mspx
misiacat 2005-09-26
  • 打赏
  • 举报
回复
我想也是数组,现在在用VB2005了一时没缓过来,枉我学了VC!
但是VB2005下数组确实是用DataRow()表示的么?晕~
我想问一下青铄,无论在DataGridView有没有排序,绑定后怎样获得选中行的index?
dalianu 2005-09-26
  • 打赏
  • 举报
回复
从DataGrid取,不要用绑定的表取就可以
zssd_039() 的方法可行.
遍历表或者DataView都浪费资源.
要是真的想直接的到DataRow
可以用Table.Select(...)
不过还是需要取到唯一的字段,似乎也简单不到哪去...
不过可以试试^_^
Dim dt As DataTable
Dim dr() As DataRow
Dim str As String
dt = CType(Me.DataGrid1.DataSource, DataTable)
str = dt.Columns(0).ColumnName + "='" + dt.Rows(Me.DataGrid1.CurrentRowIndex).Item(0) + "'"
dr = dt.Select(str)

dr(0)就是取得的DataRow,如果str不能唯一标识出来就是dr(n)了....
Tsingli 2005-09-26
  • 打赏
  • 举报
回复
DataRow[]就是DataRow的数组,呵呵!
mkjordan 2005-09-26
  • 打赏
  • 举报
回复
//设置DataGrid的数据源
dataGrid1.DataSource = myDataSet;
dataGrid1.DataMember = "customers";

//建立同DataGrid同样数据源的BindingManagerBase
BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];
一旦建立了这个BindingManagerBase,就可以通过BindingManagerBase的当前行的属性来获取当前数据源的记录:

//BindingManagerBase的Current返回数据源的对象,对于绑定到DataView的数据源,需要将此对象显式的转换为 DataRowView类型
DataRowView myDataRowView =(DataRowView) myBindingManagerBaseParent.Current
misiacat 2005-09-26
  • 打赏
  • 举报
回复
我也用的DataGridView,也碰到了LZ说的排序后混乱的问题,请问青烁,你的“DataRow[]”是什么呀?我是在VB下做的。
henrysap 2005-09-26
  • 打赏
  • 举报
回复
利用Dataview
dv.Item(CurrentRowIndex).Row
Tsingli 2005-09-26
  • 打赏
  • 举报
回复
int rowNum = dataGrid.CurrentCell.RowNumber;
int recordID = Convert.ToInt32(dataGrid[rowNum, 0]);
我用的是2.0的dataGridView,这时用
int recordID = Convert.ToInt32(dataGridView.CurrentRow.Cells["编号"].Value);
然后
DataRow[] specificRows = myDataTable.Select("编号 = " + recordID.ToString());
这里“编号”是表的主键,由于主键唯一,所以所得的specificRows 就一行!
foxbuilder 2005-09-26
  • 打赏
  • 举报
回复
to: KahnWinsock(卡恩) 你说的不能解决排序的问题
to: ganyuclok(会飞的ぷ鱼ぷ) 我现在也就是用的这个方法.看来没有更好的办法了.

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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