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

在不同类中设置Button可见性的实现方案咨询

解决方案:在DataGrid所属类中控制Button可见性

针对你需要在DataGrid加载的类中隐藏5个Button、无法在设计器类操作的场景,提供三种可行方案,按耦合度从高到低排列:

方案1:直接传递Button实例(快速实现)

如果追求简单直接,可将需要控制的Button作为参数传入当前类的方法。以你提供的CostSQL方法为例,修改如下:

修改方法签名

public static void CostSQL(string connstring, string passableQuery, IEdmVault7 vault, int ID, IEdmFolder5 Folder, params Button[] buttonsToHide)

在方法中设置可见性

在try块内合适的位置(比如弹出窗口前/后)添加隐藏逻辑:

// 遍历传入的按钮,设置为不可见
foreach(var btn in buttonsToHide)
{
    if(btn != null)
        btn.Visible = false;
}

调用示例

// 传入需要隐藏的5个Button实例
CostSQL(connStr, query, vault, id, folder, btn1, btn2, btn3, btn4, btn5);

优缺点:实现简单,但当前类与UI控件强耦合,不利于后续代码复用和维护。


方案2:通过委托/事件解耦(推荐)

为降低类之间的耦合,可通过事件通知设计器所属类执行隐藏操作,当前类无需知晓具体控件信息。

在DataGrid所属类中定义事件

// 定义静态事件,用于通知隐藏按钮
public static event Action HideRequiredButtons;

在CostSQL方法中触发事件

在需要隐藏按钮的时机(比如数据加载完成后)触发事件:

// 触发事件,通知订阅方执行隐藏逻辑
HideRequiredButtons?.Invoke();

在设计器所属类中订阅事件

在窗口初始化或DataGrid加载时,订阅该事件:

// 假设DataGrid所属类名为YourDataGridClass
YourDataGridClass.HideRequiredButtons += () =>
{
    btn1.Visible = false;
    btn2.Visible = false;
    btn3.Visible = false;
    btn4.Visible = false;
    btn5.Visible = false;
};

优缺点:解耦业务类与UI控件,代码更易维护;需注意事件订阅的生命周期,避免内存泄漏。


方案3:MVVM模式(适合复杂WPF场景)

如果是WPF项目,推荐使用MVVM模式,通过数据绑定实现UI状态控制,完全解耦逻辑与界面。

1. 定义ViewModel

public class MainViewModel : INotifyPropertyChanged
{
    private bool _buttonsAreVisible = true;
    public bool ButtonsAreVisible
    {
        get => _buttonsAreVisible;
        set
        {
            _buttonsAreVisible = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. XAML绑定Visibility

在窗口的Resources中添加转换器:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>
</Window.Resources>

然后给Button绑定属性:

<Button Content="按钮1" Visibility="{Binding ButtonsAreVisible, Converter={StaticResource BoolToVis}}"/>
<!-- 其余4个Button重复上述绑定逻辑 -->

3. 在DataGrid所属类中修改ViewModel属性

// 获取窗口的ViewModel实例(假设窗口DataContext已设置为MainViewModel)
var viewModel = (MainViewModel)Application.Current.MainWindow.DataContext;
// 设置按钮不可见
viewModel.ButtonsAreVisible = false;

优缺点:完全解耦逻辑与UI,适合大型项目;需要搭建MVVM基础结构,有一定学习成本。


你提供的原始代码参考

public static void CostSQL(string connstring, string passableQuery, IEdmVault7 vault, int ID, IEdmFolder5 Folder)
{
    try
    {
        SqlConnection con = new SqlConnection(connstring);
        con.Open();

        //concat later to optimize code for universal use by passing variable quote
        SqlCommand cmd = new SqlCommand(passableQuery, con);
        DataTable rTbl = new DataTable();
        
        rTbl.Load(cmd.ExecuteReader());
        SQLResultSelector RSel = new SQLResultSelector(rTbl, vault, ID, "c", Folder);
        RSel.ShowDialog();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Something happend during your connection to SQL error : " + ex.Message);
    }
}

内容的提问来源于stack exchange,提问作者Angela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:39