You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:49:54