gridview控件,怎么点击选中,获取行的数据

gridview控件,怎么点击选中,获取行的数据,第1张

将你那个按钮的commandName设置为selected

dataKeyNames 设置成你的数据主键

然后在gridview的 Rowcommand事件里面通过 eCommandArgument获得主键值

然后、、、

zhccsd

|

十级

最快回答

有一个属性,Always Show Selection,打上勾就可以了

追问

是高亮,不是变灰

老常时间没用windows了,如果离开控件焦点后选中行是变成灰色,那么你只有一个办法,重载那个变灰的函数

问题:CListCtrl如何高亮选中一行 >

可以做到的,做一个ListCtrl的派生类CMyListCtrl,表中的数据是从数据库得到的,你自己添加数据吧.

void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

this->SetFocus();

UINT uFlags;

int nItem = HitTest(point, &uFlags);

if (uFlags & LVHT_ONITEMICON ){

this->SetHotItem(nItem);//有这句就可以实现列表中的字体变色了

}

CListCtrl::OnMouseMove(nFlags, point);

}

在其它类,比如(CListCtrlTestDlg)的OnInitDialog加入以下代码,在CListCtrlTestDlg头文件中加入#include "MyListCtrlh",当前使用的列表控件对象是:CMyListCtrl m_list;

BOOL CListCtrlTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

m_listSetExtendedStyl(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_GRIDLINES|LVS_EX_FLATSB);

m_listSetTextColor(RGB(200, 0, 0));//列表中的字体为红色

m_listInsertColumn(0, "员工编号");

m_listInsertColumn(1, "姓名");

m_listInsertColumn(2, "性别");

m_listInsertColumn(3, "年龄");

m_listInsertColumn(4, "个人手机");

m_listInsertColumn(5, "联系电话");

m_listInsertColumn(6, "联系地址");

m_listInsertColumn(7, "工作职位");

for(int j = 0; j < 8; j++){

m_listSetColumnWidth(j, LVSCW_AUTOSIZE);

m_listSetColumnWidth(j, LVSCW_AUTOSIZE_USEHEADER);

}

CString sql = "select from yginfo";

RefrushList(sql);//数据库访问函数,略...

return TRUE; // return TRUE unless you set the focus to a control

}

列表控制的成员函数CListCtrl::GetSelectionMark的返回值是列表中焦点所在的行数(从第0行开始记),如果没有焦点在列表上则返回-1;和它对应的函数还有一个CListCtrl::SetSelectionMark,设置选中行;

比如,如果没有选择列表时选中第0行:

CListCtrl pmyListCtrl;

if (pmyListCtrl->GetSelectionMark() == –1)

pmyListCtrl->SetSelectionMark(0);

POSITION pos = m_ctrlJTCZ(你的控件名字)->GetFirstSelectedItemPosition();

if (pos==NULL)

{ MessageBox("请选择一行!");

return;

}

if (IDNO==MessageBox("确认要删除吗","删除提示",MB_YESNO))

{

return;

}

int nIndex = m_ctrlJTCZ->GetNextSelectedItem(pos);

m_ctrlJTCZ->DeleteItem(nIndex);

然后再执行delete语句就可以了

1

ClistCtrl有四种样式,ICON,small icon,list,report,其中前三种一般使用的都很少,report是ClistCtrl的重点也是他的精髓,当然这四种样式的样式图例,大家可以参照windows的资源管理器,大图标,小图标,列表和详细信息。现在先说一下前三种的使用方法。

2

前三种ICON,small icon,list都是已图标形式存在,那么他的重点也就是怎么加载图标

首先创建CImageList的对象m_ImageList1

//创建大图标,Craete创建一个图标列表,当然大小可以随意设置,这里采用的是加载ICON

if ( m_ImageList1GetSafeHandle() == NULL )

{

m_ImageList1Create(80,80,ILC_MASK|ILC_COLOR32, 0, 0);

m_ImageList1Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));

m_ListCtrl1SetImageList(&m_ImageList1, LVSIL_NORMAL);

}

//加载BMP

if (m_StatusImageGetSafeHandle()==NULL)

{

CBitmap Image;

BITMAP ImageInfo;

ImageLoadBitmap(IDB_SERVER_LIST_IMAGE);

ImageGetBitmap(&ImageInfo);

m_StatusImageCreate(18,ImageInfobmHeight,ILC_COLOR16|ILC_MASK,0,0);

m_StatusImageAdd(&Image,RGB(255,0,255));

}

m_ListCtrl2SetImageList(&m_StatusImage,LVSIL_SMALL);

m_ListCtrl3SetImageList(&m_StatusImage,LVSIL_SMALL);

//插入节点

for (int i=0;i<40;i++)

{

m_ListCtrl1InsertItem(i, TEXT("Item"));

m_ListCtrl2InsertItem(i, TEXT("Item"));

m_ListCtrl3InsertItem(i, TEXT("Item"));

}

到这里,我们就添加了图标形式的节点,现在在说一下Report的 *** 作方法,当然下面的 *** 作也适用于图标样式,关于ClistCtrl的成员函数讲解,参照MSDN,这里只说明使用方法

END

Report风格的CListCtrl的使用

1

创建列,也就是为标头控件添加节点

m_ListCtrl4InsertColumn( 0, TEXT("Main_1"), LVCFMT_LEFT, 70 );

m_ListCtrl4InsertColumn( 1, TEXT("Main_2"), LVCFMT_LEFT, 70 );

m_ListCtrl4InsertColumn( 2, TEXT("Main_3"), LVCFMT_LEFT, 70 );

2

设置风格

之前我们修改窗口属性的时候都是使用的SetWindowLong函数或者ModifyStyle,这次CListCtrl为我们提供一个新函数,SetExtendedStyle,当然通过它只能修改扩展属性

支持的扩展属性很多,但是常用的就几个而已,其他的可以参照msdn,这里讲解两个常用的样式

LVS_EX_CHECKBOXES:将CListCtrl添加check控件LVS_EX_FULLROWSELECT:未添加该样式,选择一个节点,只能选中节点的第一个元素,而这个属性则可以让选择节点的时候选中整行

当然这些属性可以多个同时存在

m_ListCtrl4SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );

3

添加图标,图标的添加方式和ICON样式的添加方式是一样的,这里我们添加bmp,在了解另一种添加方式

//加载BMP图标

if (m_StatusImageGetSafeHandle()==NULL)

{

CBitmap Image;

BITMAP ImageInfo;

ImageLoadBitmap(IDB_SERVER_LIST_IMAGE);

ImageGetBitmap(&ImageInfo);

m_StatusImageCreate(18,ImageInfobmHeight,ILC_COLOR16|ILC_MASK,0,0);

m_StatusImageAdd(&Image,RGB(255,0,255));

}

m_ListCtrl4SetImageList(&m_StatusImage,LVSIL_SMALL);

4

插入节点并设置节点的文本内容

void CListCtrlDlg::OnBnClickInsert()

{

int nCount = m_ListCtrl4GetItemCount();

int nRow = m_ListCtrl4InsertItem(LVIF_IMAGE|LVIF_TEXT|LVIF_PARAM,0,TEXT("Item_1"),0,0,2,0);

m_ListCtrl4SetItemText(nRow, 1, TEXT("Item_2"));

m_ListCtrl4SetItemText(nRow, 2, TEXT("Item_3"));

}

5

判断节点是否被Check选中,GetCheck

void CListCtrlDlg::OnBnClickCheckState()

{

CString str,str1=TEXT("被Check的行数分别为:");

for(int i=0; i<m_ListCtrl4GetItemCount(); i++)

{

if( m_ListCtrl4GetCheck(i))

{

strFormat(TEXT("[%d]"),i);

str1+=str;

}

}

AfxMessageBox(str1);

}

6

获取选中行的索引,默认情况下,CListCtrl是支持多选的,支持Ctrl和Shift *** 作,如果需要单选,可以将控件的Single Selection设为true或者添加LVS_SINGLESEL属性,这里介绍两种方法:

方法1:我们通过遍历所有行,然后挨行判断当前的状态即可

CString str,str1=TEXT("选中的行数分别为:");

for(int i=0; i<m_ListCtrl4GetItemCount(); i++)

{

if( m_ListCtrl4GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )

{

strFormat(TEXT("[%d]"),i);

str1+=str;

}

}

AfxMessageBox(str1);

m_ListCtrl4SetFocus();

方法2:通过迭代的方式进行遍历

POSITION pos = m_ListCtrl4GetFirstSelectedItemPosition();

if (pos == NULL)

{

str1 = TEXT("没有选中任何节点");

}

else

{

while (pos)

{

int nItem = m_ListCtrl4GetNextSelectedItem(pos);

strFormat(TEXT("[%d]"),nItem);

str1+=str;

}

}

AfxMessageBox(str1);

m_ListCtrl4SetFocus();

7

获取列数,这里我们就使用了CHeaderCtrl控件

int nColumnCount = m_ListCtrl4GetHeaderCtrl()->GetItemCount();

8

获取节点的信息GetItem,这里我们获取最后一行的信息

void CListCtrlDlg::OnBnClickInfo()

{

TCHAR szBuffer[MAX_PATH]=TEXT("");

CString str=TEXT("节点信息分别为:");

//获取列数

int nColumnCount = m_ListCtrl4GetHeaderCtrl()->GetItemCount();

LVITEM lvi;

lviiItem = m_ListCtrl4GetItemCount()-1;

lvimask = LVIF_TEXT;

lvicchTextMax = CountArray(szBuffer);

for (int i=0;i<nColumnCount; i++)

{

lviiSubItem = i;

lvipszText = szBuffer;

m_ListCtrl4GetItem(&lvi);

str+=TEXT("[");

str+=szBuffer;

str+=TEXT("] ");

}

AfxMessageBox(str);

}

9

滚动到要显示的行上,很多时候,我们的数据比较大,而我们通过查找获取获取到了行数后,我们想快速定位的该行,这里我们就可以用EnsureVisible,这里举例定位到最后一行,并且选中该行

void CListCtrlDlg::OnBnClickVis()

{

int nItem = m_ListCtrl4GetItemCount()-1;

m_ListCtrl4EnsureVisible(nItem, FALSE);

m_ListCtrl4SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);

m_ListCtrl4SetSelectionMark(nItem);

m_ListCtrl4SetFocus();

}

10

选中行,注意:这句代码只是让指定行高亮显示,如果使用后再用GetSelectionMark函数来得到选中行,结果往往是错误的。比如,先用鼠标点击选中第5行,调用GetSelectionMark函数得到的是4(第5行),再调用SetItemState函数选中第2行,然后调用GetSelectionMark函数得到的还是4(第5行),所以,需要在设置选中行高亮显示时,一般与SetSelectionMark函数连用

m_ListCtrl4SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);

m_ListCtrl4SetSelectionMark(nItem);

m_ListCtrl4SetFocus();

11

取消选中

void CListCtrlDlg::OnBnClickUnSel()

{

for(int i=0; i<m_ListCtrl4GetItemCount(); i++)

{

if( m_ListCtrl4GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )

{

m_ListCtrl4SetItemState(i,0,LVIS_SELECTED);

}

}

m_ListCtrl4SetSelectionMark(-1);

m_ListCtrl4SetFocus();

}

12

获取标头控件的节点文本

void CListCtrlDlg::OnBnClickHead()

{

LVCOLUMN lvcol;

TCHAR szBuffer[MAX_PATH]=TEXT("");

int nColumnIndex;;

CString str=TEXT("标题头文本分别为:");

nColumnIndex = 0;

lvcolmask = LVCF_TEXT;

lvcolpszText = szBuffer;

lvcolcchTextMax = CountArray(szBuffer);

while(m_ListCtrl4GetColumn(nColumnIndex, &lvcol))

{

str+=TEXT("[");

str+= lvcolpszText;

str+=TEXT("]");

nColumnIndex++;

}

AfxMessageBox(str);

}

13

删除所有行

m_ListCtrl4DeleteAllItems();

14

删除指定行,举例删除最后一行

m_ListCtrl4DeleteItem(m_ListCtrl4GetItemCount()-1);

15

删除所有,包括标头控件,这里还是用两种方法去做

方法1:当删除了节点0之后,下面的节点都会往上移动,重新排列,所以我们只要依次把所有的第一个节点都删除即可

while( m_ListCtrl4DeleteColumn(0) );

方法2:这里和第一种方法原理类似,这次是从后往前删除

int nColumnCount = m_ListCtrl4GetHeaderCtrl()->GetItemCount();

for (int i=nColumnCount-1; i>=0; i--)

m_ListCtrl4DeleteColumn (i);

16

左键消息,添加ON_NOTIFY的NM_CLICK消息,这里我们举例单击事件的区域位置,即鼠标在哪行哪列点击了,仍然举两种方法

方法1:

void CListCtrlDlg::OnLclickList4(NMHDR pNMHDR, LRESULT pResult)

{

LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

//方法一:

DWORD dwPos = GetMessagePos();

CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

m_ListCtrl4ScreenToClient(&point);

LVHITTESTINFO lvinfo;

lvinfopt = point;

lvinfoflags = LVHT_ABOVE;

int nItem = m_ListCtrl4SubItemHitTest(&lvinfo);

if(nItem != -1)

{

CString str;

strFormat(TEXT("单击的是第%d行第%d列"), lvinfoiItem, lvinfoiSubItem);

AfxMessageBox(str);

}

pResult = 0;

}

方法2:

void CListCtrlDlg::OnLclickList4(NMHDR pNMHDR, LRESULT pResult)

{

LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

// 方法二:

NM_LISTVIEW pNMListView = (NM_LISTVIEW)pNMHDR;

if(pNMListView->iItem != -1)

{

CString str;

strFormat(TEXT("单击的是第%d行第%d列"),pNMListView->iItem, pNMListView->iSubItem);

AfxMessageBox(str);

}

pResult = 0;

}

17

右键消息:添加ON_NOTIFY的NM_RCLICK消息,这里举例是右键菜单

void CListCtrlDlg::OnRclickList1(NMHDR pNMHDR, LRESULT pResult)

{

NM_LISTVIEW pNMListView = (NM_LISTVIEW)pNMHDR;

if(pNMListView->iItem != -1)

{

DWORD dwPos = GetMessagePos();

CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

CMenu menu;

if (menuCreatePopupMenu()==FALSE) return;

menuAppendMenu(0,2000,TEXT("菜单节点"));

menuAppendMenu(0,2001,TEXT("菜单节点"));

menuAppendMenu(0,2002,TEXT("菜单节点"));

menuTrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,pointx,pointy,this);

}

pResult = 0;

}

以上就是关于gridview控件,怎么点击选中,获取行的数据全部的内容,包括:gridview控件,怎么点击选中,获取行的数据、MFC CListCtrl控件,选中某行离开焦点任然保持高亮状态。、MFC 自绘CListCtrl如何让选中行高亮等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9779634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存