求GeneXus「另存为」窗口C#代码,需实现Module/Folder控件
GeneXus「另存为」风格窗口Module/Folder控件的C#实现示例
以下是适配你需求的核心代码,实现了从PXWorkWith节点复用信息、收集名称/描述/模块/文件夹,最终创建PXQuery实例的完整逻辑:
必要命名空间引用
using GeneXus.Application; using GeneXus.GXart; using GeneXus.Utils; using System.Windows.Forms; using System.Threading.Tasks;
扩展窗口核心代码
public class PXQueryCreateForm : Form { private ComboBox _cboModule; private ComboBox _cboFolder; private TextBox _txtName; private TextBox _txtDescription; private readonly TreeNode _sourcePXWorkWithNode; // 构造函数接收右键触发的原PXWorkWith节点 public PXQueryCreateForm(TreeNode sourceNode) { _sourcePXWorkWithNode = sourceNode; InitializeUI(); LoadModuleData(); PopulateSourceNodeInfo(); } // 初始化控件布局 private void InitializeUI() { // 名称输入框 _txtName = new TextBox { Location = new System.Drawing.Point(15, 15), Width = 280, PlaceholderText = "输入PXQuery名称" }; // 描述输入框 _txtDescription = new TextBox { Location = new System.Drawing.Point(15, 45), Width = 280, Multiline = true, Height = 70, PlaceholderText = "输入PXQuery描述" }; // 模块下拉框 _cboModule = new ComboBox { Location = new System.Drawing.Point(15, 125), Width = 280, DropDownStyle = ComboBoxStyle.DropDownList }; _cboModule.SelectedIndexChanged += OnModuleSelected; // 文件夹下拉框 _cboFolder = new ComboBox { Location = new System.Drawing.Point(15, 155), Width = 280, DropDownStyle = ComboBoxStyle.DropDownList }; // 创建按钮 var btnCreate = new Button { Text = "创建PXQuery", Location = new System.Drawing.Point(210, 190), DialogResult = DialogResult.OK }; btnCreate.Click += OnCreatePXQuery; // 添加控件到窗口 Controls.Add(_txtName); Controls.Add(_txtDescription); Controls.Add(_cboModule); Controls.Add(_cboFolder); Controls.Add(btnCreate); // 窗口基础设置 Size = new System.Drawing.Size(310, 240); Text = "创建PXQuery实例"; StartPosition = FormStartPosition.CenterParent; } // 加载项目所有模块 private void LoadModuleData() { _cboModule.Items.Clear(); foreach (GXModule module in GXContext.Current.Project.Modules) { _cboModule.Items.Add(new ModuleItem { Id = module.Id, Name = module.Name }); } _cboModule.DisplayMember = "Name"; _cboModule.ValueMember = "Id"; if (_cboModule.Items.Count > 0) _cboModule.SelectedIndex = 0; } // 模块切换时刷新文件夹列表 private void OnModuleSelected(object sender, EventArgs e) { _cboFolder.Items.Clear(); if (_cboModule.SelectedItem is not ModuleItem selectedModule) return; var module = GXContext.Current.Project.GetModule(selectedModule.Id); foreach (GXFolder folder in module.Folders) { _cboFolder.Items.Add(new FolderItem { Id = folder.Id, Name = folder.Name }); } _cboFolder.DisplayMember = "Name"; _cboFolder.ValueMember = "Id"; if (_cboFolder.Items.Count > 0) _cboFolder.SelectedIndex = 0; } // 从原PXWorkWith节点提取信息自动填充表单 private void PopulateSourceNodeInfo() { if (_sourcePXWorkWithNode.Tag is not GXArtObject pxWorkWithObj) return; // 自动生成默认名称 _txtName.Text = $"{pxWorkWithObj.Name}_Query"; // 自动生成描述 _txtDescription.Text = $"基于[{pxWorkWithObj.Name}]的查询实例"; // 选中原对象所属模块 foreach (ModuleItem item in _cboModule.Items) { if (item.Id == pxWorkWithObj.Module.Id) { _cboModule.SelectedItem = item; break; } } // 延迟选中原对象所属文件夹(等待模块切换事件完成) Task.Delay(100).ContinueWith(_ => { Invoke(() => { foreach (FolderItem item in _cboFolder.Items) { if (item.Id == pxWorkWithObj.Folder.Id) { _cboFolder.SelectedItem = item; break; } } }); }); } // 创建PXQuery实例并复用原节点配置 private void OnCreatePXQuery(object sender, EventArgs e) { if (_cboModule.SelectedItem is not ModuleItem selectedModule || _cboFolder.SelectedItem is not FolderItem selectedFolder) return; var module = GXContext.Current.Project.GetModule(selectedModule.Id); var folder = module.GetFolder(selectedFolder.Id); // 创建PXQuery模式实例 var pxQueryObj = GXArtFactory.CreateObject("PXQuery", module, folder); pxQueryObj.Name = _txtName.Text.Trim(); pxQueryObj.Description = _txtDescription.Text.Trim(); // 复用原PXWorkWith的核心配置(示例:数据源、关联实体等,需根据PXTools实际API调整) if (_sourcePXWorkWithNode.Tag is GXArtObject pxWorkWithObj) { pxQueryObj.SetProperty("DataSource", pxWorkWithObj.GetProperty("DataSource")); pxQueryObj.SetProperty("EntityName", pxWorkWithObj.GetProperty("EntityName")); // 可添加更多需要复用的属性 } // 保存实例并刷新项目树 pxQueryObj.Save(); GXContext.Current.Project.RefreshTree(); Close(); } // 辅助类:用于模块/文件夹下拉框数据绑定 private class ModuleItem { public string Id { get; set; } public string Name { get; set; } } private class FolderItem { public string Id { get; set; } public string Name { get; set; } } }
右键菜单触发逻辑
在你的扩展中注册PXWorkWith节点的右键点击事件,调用窗口:
// 示例:右键菜单点击事件处理 private void OnPXWorkWithNodeRightClick(object sender, TreeNodeMouseClickEventArgs e) { // 根据节点标识判断是否为PXWorkWith实例节点 if (e.Node.Tag is GXArtObject artObj && artObj.Type == "PXWorkWith") { using var createForm = new PXQueryCreateForm(e.Node); createForm.ShowDialog(); } }
关键说明
- Module/Folder控件逻辑:通过
GXContext.Current.Project获取当前项目的模块和文件夹集合,实现模块切换时自动联动刷新文件夹列表。 - 信息复用:利用原PXWorkWith节点的
Tag属性获取GeneXus对象实例,自动填充名称、描述并选中原所属模块/文件夹。 - PXQuery创建:通过
GXArtFactory.CreateObject实例化PXQuery模式,复用原节点的核心配置后保存并刷新项目树。
内容的提问来源于stack exchange,提问作者Juan Marcelo Bustamante Lamas
相关产品推荐
相关产品推荐

