C++/CLI 中使用name属性操纵动态创建的控件

本文探讨了使用C++/CLI在Windows窗体中批量动态创建PictureBox控件的方法,并解决了如何通过名称属性对这些控件进行后期操作的问题。通过遍历控件集合的方式实现了对指定名称控件的查找。

这几天一直在折腾C++/CLI的Windwos窗体,折腾到批量动态创建控件的时候发现一个问题

批量用句柄创建的控件,只有name这个属性有规律,后期要操作的时候只能通过name找

比如在下列代码中,通过CreatePictureBox()动态创建PictureBox,但是后期如果要对动态创建的控件进行操作该怎么办呢?

//第一个参数为新增的控件name,第二个为颜色信息,0=黑、1=红、其他=绿
private: bool CreatePictureBox(String ^name, int ColorNum)

{
	 PictureBox ^pb = gcnew PictureBox();

	 //根据颜色数字改变图片文件
	 if (ColorNum == 0){
		 pb->ImageLocation = "black1.png";
	 }
	 else if (ColorNum == 1)
	 {
		 pb->ImageLocation = "red.png";
	 }
	 else
	 {
		 pb->ImageLocation = "Green.png";

	 }
	 
	 //改变pb的name属性作为标识
	 pb->Name = name;
	 pb->Name = ColorNum.ToString();

	 //在Controls控件中添加pb
	 Controls->Add(pb);
}

 

在MSDN里找不到C++的方法FindControl,网上也没有C++/CLI的相关办法

于是,想到用遍历控件来解决,果然就可以了,很暴力但很实用

 

//通过name查找控件方法,重载
private:Control ^ FindControl(String ^ControlName){
	for each (Control ^ctr in this->Controls) {
		if (ctr->Name == ControlName){
			return ctr;
		}
	}

	MessageBox::Show("未找到这个控件");
	return nullptr;
}

 

参考资料:

1、Control.FindControl 方法 (String) - MSDN

     实测只有C#有该方法,C++并没有实例

### 实现可编辑的 TreeListView 控件 在 C++/CLI 环境中使用 WPF 创建一个可编辑的树形表格控件(TreeListView),需要结合 `TreeView` 和 `GridView` 的功能,并通过数据绑定和样式定义实现可编辑性。以下是详细的实现方法: --- #### 1. 数据模型设计 为了支持树形结构和表格视图,数据模型需要包含层级关系和可编辑字段。以下是一个示例数据模型: ```cpp using namespace System; using namespace System::Collections::ObjectModel; public ref class TreeNode { private: String^ _name; String^ _value; ObservableCollection<TreeNode^>^ _children; public: property String^ Name { String^ get() { return _name; } set(String^ value) { _name = value; } } property String^ Value { String^ get() { return _value; } set(String^ value) { _value = value; } } property ObservableCollection<TreeNode^>^ Children { ObservableCollection<TreeNode^>^ get() { return _children; } } TreeNode(String^ name, String^ value) { _name = name; _value = value; _children = gcnew ObservableCollection<TreeNode^>(); } }; ``` --- #### 2. XAML 定义 TreeListView 样式 通过 XAML 定义 `TreeView` 的外观和行为,结合 `HierarchicalDataTemplate` 和 `GridView` 实现树形表格视图。 ```xml <Window.Resources> <Style TargetType="TreeViewItem"> <Setter Property="IsExpanded" Value="True" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <ToggleButton x:Name="Expander" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}" /> <Border Grid.Column="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ContentPresenter Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" /> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="HasItems" Value="False"> <Setter TargetName="Expander" Property="Visibility" Value="Hidden" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- 定义 HierarchicalDataTemplate --> <HierarchicalDataTemplate DataType="local:TreeNode" ItemsSource="{Binding Children}"> <StackPanel Orientation="Horizontal"> <TextBox Text="{Binding Name, Mode=TwoWay}" Width="150" Margin="5" /> <TextBox Text="{Binding Value, Mode=TwoWay}" Width="150" Margin="5" /> </StackPanel> </HierarchicalDataTemplate> </Window.Resources> <TreeView x:Name="treeListView" /> ``` --- #### 3. 初始化数据并绑定到 TreeView 在代码中初始化数据模型并将其绑定到 `TreeView`。 ```cpp #include "TreeNode.h" public ref class MainWindow : public System::Windows::Window { public: MainWindow() { InitializeComponent(); // 初始化根节点 TreeNode^ root = gcnew TreeNode("Root", "Root Value"); root->Children->Add(gcnew TreeNode("Child 1", "Value 1")); root->Children->Add(gcnew TreeNode("Child 2", "Value 2")); // 将根节点添加到 TreeView treeListView->Items->Add(root); } private: void InitializeComponent() { this->Content = gcnew TreeView(); this->Title = "TreeListView Example"; this->Width = 400; this->Height = 300; this->treeListView = dynamic_cast<TreeView^>(this->Content); } TreeView^ treeListView; }; ``` --- #### 4. 实现可编辑功能 通过 `TextBox` 绑定到数据模型的属性,并设置 `Mode=TwoWay` 来实现双向绑定,从而支持用户直接编辑内容[^1]。 --- #### 5. 添加交互逻辑 可以通过事件处理程序捕获用户的操作,例如双击编辑、右键菜单等。以下是一个简单的右键菜单示例: ```xml <TreeView.ContextMenu> <ContextMenu> <MenuItem Header="Add Child" Click="AddChild_Click" /> <MenuItem Header="Remove Node" Click="RemoveNode_Click" /> </ContextMenu> </TreeView.ContextMenu> ``` ```cpp void AddChild_Click(Object^ sender, RoutedEventArgs^ e) { TreeNode^ selectedNode = safe_cast<TreeNode^>(treeListView->SelectedItem); if (selectedNode != nullptr) { selectedNode->Children->Add(gcnew TreeNode("New Child", "New Value")); } } void RemoveNode_Click(Object^ sender, RoutedEventArgs^ e) { TreeNode^ selectedNode = safe_cast<TreeNode^>(treeListView->SelectedItem); if (selectedNode != nullptr && selectedNode->Parent != nullptr) { safe_cast<ObservableCollection<TreeNode^>^>(selectedNode->Parent->Children)->Remove(selectedNode); } } ``` --- ### 注意事项 - 确保在项目中启用 CLR 支持,并正确引用 WPF 相关库。 - 使用 `DynamicResource` 或 `StaticResource` 定义样式时,需确保资源已正确定义并可用[^1]。 - 在复杂场景下,可以考虑使用 MVVM 模式分离视图和逻辑。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值