C++Builder中ListView控件用法和示例总结整理

示例1(此示例转自ccrun 妖哥):

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    // 切换ListView的显示风格为详细信息
    ListView1->ViewStyle = vsReport;

    // 清除ListView所有列和行的内容
    ListView1->Columns->Clear();
    ListView1->Items->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 添加第一列
    TListColumn *lc = ListView1->Columns->Add();
    lc->Caption = "第一列";
    lc->Width = 120;

    // 添加第二列
    lc = ListView1->Columns->Add();
    lc->Caption = "第二列";
    lc->Width = 80;

    // 添加第三列
    lc = ListView1->Columns->Add();
    lc->Caption = "第三列";
    lc->Width = 100;

    Application->ProcessMessages();

    // 修改第二列的标题
    ShowMessage("点击确定后修改第二列的标题");
    if (ListView1->Columns->Count > 1)
    {
        lc = ListView1->Columns->Items[1];

        lc->Caption = "第二列新标题";
        lc->Width = 120;
    }

    // 添加第一行数据
    TListItem *li = ListView1->Items->Add();
    li->Caption = "一行一列";
    li->SubItems->Add("一行二列");
    li->SubItems->Add("一行三列");

    // 添加第二行数据
    li = ListView1->Items->Add();
    li->Caption = "二行一列";
    li->SubItems->Add("二行二列");
    li->SubItems->Add("二行三列");

    // 添加第三行数据
    li = ListView1->Items->Add();
    li->Caption = "二行一列";
    li->SubItems->Add("二行二列");
    li->SubItems->Add("二行三列");

//加Application->ProcessMessages()只是为了让窗口处理一下其他的消息,界面上的显示更新一下而已.在有些情况下,窗口内容变化但界面没有刷新时,可以加这么一句. Application->ProcessMessages(); // 修改第三行的数据 ShowMessage("点击确定后修改第三行的数据"); if (ListView1->Items->Count > 2) { li = ListView1->Items->Item[2]; li->Caption = "二行一列新内容"; li->SubItems->Strings[0] = "二行二列新内容"; li->SubItems->Strings[1] = "二行三列新内容"; } }

示例2: 

ListView右键点击图标弹出菜单的用法

将ListView的PopupMenu属性设为MyPopupMenu,这样只要选中ListView点右键即可出现我的MyPopupMenu菜单。

但这种方式,无论右击ListView上的任何位置,都会弹出菜单,要想必须选中某个子项后才能进行菜单事件的话,可以在菜单事件中加入判断,没有选中则返回

if(ListView1->Selected == NULL)
  return;

 

另一种方式是,将ListView的PopupMenu属性留空,在ListView的OnMouseDown事件中处理

void __fastcall TMainForm::ListView1MouseDown(TObject *Sender, TMouseButton Button,
		  TShiftState Shift, int X, int Y)
{
  //不是右击或者没有点中则返回,不作反应
  if(Button != mbRight || NULL==ListView1->GetItemAt(X, Y))
	 return;

  //只点选图标,不能点文字,可以加以下3行
  THitTests ht=ListView1->GetHitTestInfoAt(X,Y);
  if(!ht.Contains(htOnIcon))
	 return;

  PopupMenuZW->Popup(Mouse->CursorPos.x, Mouse->CursorPos.y);
}

 

示例3

多个ListView共用一个PopupMenu,菜单事件中要传递被选中的项目信息,如果是数字,可以在点击事件中复制给PopupMenu的Tag,在菜单事件中调用Tag值即可,如果是文字信息,目前想到的是如下方法:

void __fastcall TMainForm::N2Click(TObject *Sender)
{
	if (PopupMenuZW->PopupComponent->Name=="ListView1")
	{
	  if(ListView1->Selected == NULL)
		return;

	  Edit4->Text=ListView1->Selected->Caption;
	}

	if (PopupMenuZW->PopupComponent->Name=="ListView2")
	{
	  if(ListView2->Selected == NULL)
		return;

	  Edit4->Text=ListView2->Selected->Caption;
	}

	if (PopupMenuZW->PopupComponent->Name=="ListView3")
	{
	  if(ListView3->Selected == NULL)
		return;

	  Edit4->Text=ListView3->Selected->Caption;
	}

	if (PopupMenuZW->PopupComponent->Name=="ListView4")
	{
	  if(ListView4->Selected == NULL)
		return;

	  Edit4->Text=ListView4->Selected->Caption;
	}

	if (PopupMenuZW->PopupComponent->Name=="ListView5")
	{
	  if(ListView5->Selected == NULL)
		return;

	  Edit4->Text=ListView5->Selected->Caption;
	}

}

 

示例4  

获取ListView中某行某列的值,可以

ListView1->Items->Item[i]->Caption = "第i行第1列的值";
ListView1->Items->Item[i]->SubItems->Strings[0]= "第i行第2列的值";
ListView1->Items->Item[i]->SubItems->Strings[1]= "第i行第3列的值";
ListView1->Items->Item[i]->SubItems->Strings[2]= "第i行第4列的值";
  

已知某项的值,修改对应的图标,目前想到的方法是

 for(int i=0;i<=ListView1->Items->Count-1;i++)
 {
     if(ListView1->Items->Item[i]->Caption=="5排8座")
{ ListView1->Items->Item[i]->ImageIndex=1; break; } }

  

其他搜集到的示例:

转自C++Builder 移动开发研究 (92227302) QQ群
让ListView控件失去焦点后仍保持选中状态:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->HideSelection = false; // 失去焦点后仍保持选中状态
  //suiTreeView1->HideSelection = false; // 失去焦点后仍保持选中状态
}

对suiDBMemo控件等同样适用,但ListBox控件没有这样的属性。

使用图标:

  //ListView1->LargeImages=ImageList1; // 设置存放大图标的图标列表,当列表处于大图标显示方式时,列表使用这个图标列表中的图标显示
  ListView1->SmallImages=ImageList1; // 设置存放小图标的图标列表,当列表处于小图标显示方式时,列表使用这个图标列表中的图标显示
  //ListView1->StateImages=ImageList1; // 状态图标,用不同的的图像来表示节点的不同状态
  // 如果要在不是当前被选中的节点的左边显示图像,那么应该在编辑框Image Index
  // 中输入图像的索引号。要禁止显示图像可以把这个节点Image Index设置为缺省值-1。
  // 如果要在被选中的节点的左边显示图像,应该在编辑框Selected Index中指定图像的索引号,索引号是从0开始的。要禁止显示图像可以把它设置为缺省值-1。
  // 如果要在节点的左边多显示一个图像,可以在编辑框State Index中输入图像的索引号。这个索引号代表Tree View组件中的StateImages属性所表示的图像列表的索引。要禁止显示图像可以把这个项目设置为缺省值-1。
  // 注意:Image Index与 Selected Index 使用的是Images指定的ImageList;而State Index使用的是StateImages 指定的ImageList。

  ListView1->Items->Item[ListView1->Items->Count-1]->ImageIndex=0; // 最后一个节点是使用第一个图标

1、常用代码:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //Edit1->Text=ListView1->SelCount; // 取得被选中的节点总数

  //ListView1->Selected->ImageIndex=1; // 改变选中节点图标

    //if(suiListView1->Items->Count<=0) // 判断是否为空

  //Edit1->Text=ListView1->Items->Count; // 取得节点总数

  //ListView2->Items=ListView1->Items; // 在两个ListView控件之间传递结构

  //ListView1->Items->Item[a] = ListView1->Items->Item[a+1]; // 在两个节点之间传递结构

  //ListView1->Items->Add()->Caption = Edit1->Text; // 增加新节点

  //ListView1->Items->Add()->SubItems->Add("str"); // 仅增加子节点

  //ListView1->RowSelect = true; // 允许整行选中

  //ListView1->Clear(); // 清空
  或:
  //ListView1->Items->Clear(); // 清空

  //Edit1->Text=ListView1->Items->Count; // 取得总行数

  //Edit1->Text=ListView1->Selected->Index; // 取得选中行的行号
  或:
  //Edit1->Text=ListView1->Items->IndexOf(ListView1->Selected); // 取得选中行的行号

  //Edit1->Text=ListView1->Selected->SubItems->Text; // 取得选中节点下所有子节点的文本,不同节点的文本之间用空格分开

  //ListView1->Selected->Delete(); // 从ListView视图中将选中的条目删除

  //Memo1->Lines->Add(ListView1->Items->Item[0]->Top); // 指定节点的竖向位置

  //Memo1->Lines->Add(ListView1->Items->Item[0]->Left); // 指定节点的横向位置

  //Edit1->Text=ListView1->Items->Item[0]->Caption; // 取得指定节点的文本

  //Edit1->Text=ListView1->Selected->Caption; // 取得选中节点的文本
  或:
  //Edit1->Text=ListView1->Items->Item[ListView1->Selected->Index]->Caption; // 取得选中节点的文本

  //ListView1->Items->Item[0]->Caption = "sdfs"; // 修改第一层指定节点的文本

  //ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("buffer"); // 在最后一行追加子节点

  //ListView1->Items->Item[0]->SubItems->Add("buffer"); // 在指定行追加子节点
  // 本教程由 C++Builder 移动开发研究 (92227302) QQ群原创并群内首发,转载请注明出处,谢谢合作!
  ListView1->ViewStyle=vsIcon; // 大图标
  //ListView1->ViewStyle=vsSmallIcon; // 小图标
  //ListView1->ViewStyle=vsList; // 列表
  //ListView1->ViewStyle=vsReport; // 详细资料
}

3、追加节点:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //ListView1->Clear(); // 清空
  ListView1->Items->Add(); // 增加节点
  ListView1->Items->Item[ListView1->Items->Count-1]->Caption = "hniuh"; // 给节点命名
}

4、当鼠标指针移动到节点上时,改变字体颜色为蓝色:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->HotTrack=true; // 当鼠标指针移动到节点上时,改变字体颜色为蓝色
}
  或:
void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
  ListView1->HotTrack=true; // 当鼠标指针移动到节点上时,改变字体颜色为蓝色
}

5、禁止用户通过鼠标直接点击的方法修改节点的文本:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->ReadOnly=true; // 禁止用户直接修改节点的标题
}

6、设置指定的行处于选中状态:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  ListView1->Items->Item[0]->Selected=True; // 设置指定的行处于选中状态,行号从0开始
  ListView1->SetFocus(); // 获得焦点
  或:
  //ListView1->Selected = ListView1->Items->Item[0];
  //ListView1->SetFocus(); // 获得焦点
}

7、在控件中增加新列并显示列图标:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TListColumn* NewColumn; // 列表列
  //ListView1->RowSelect = true; // 准许可以整行选中
  NewColumn = ListView1->Columns->Add(); // 增加一列
  NewColumn->Caption = "自转周期(天)"; // 列的名称
  NewColumn->Width = 100; // 列的宽度
  NewColumn->ImageIndex=1; // 列头图标号
  //delete NewColumn; // 使用后添加的项目被清除
}

8、添加新节点并指定节点图标:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //ListView1->Clear(); // 清空
  TListItem * pList = ListView1->Items->Add();
  pList->Caption = Edit1->Text;
  pList->SubItems->Add("str");
  pList->ImageIndex=1;
  //delete pList; // 使用后添加的项目被清除
}

9、更换选中节点的图标:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(ListView1->SelCount>0) // 如果有节点被选中
      ListView1->Selected->ImageIndex=1; // 更换选中节点的图标
}

10、更换所有节点的图标:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for(int i=0;i<=ListView1->Items->Count-1;i++){
      ListView1->Items->Item[i]->ImageIndex=1;
    }
}

  

 

 

posted @ 2015-09-28 16:17  WXFame  阅读(4567)  评论(0编辑  收藏  举报