0

GUI の認証フレームワークを作成しています。ユーザーは有効な資格情報でログインし、ユーザーがアクセスできるメニュー オプション (ボタン) が表示されます。

ユーザーに割り当てられた権限に基づいて、ボタンの可視性を表示または非表示にする予定です。

プログラムでボタンの可視性を参照して切り替える最良の方法を考えるのに苦労しています。メニュー項目を表示するかどうかを詳細に示すリストがありますが、フォームのボタンに対してそのリストを参照する方法がわかりません。

各ボタン オブジェクトの名前を入力して、リストに対してテストし、ボタンの可視性を切り替えることは簡単にできますが、これはあまり効率的ではないように思えます。

以下のコード。ボタン項目を有効/無効にするにはどうすればよいですか?

class Menu
{
    public int Id { get; set; }
    public string MenuItemFriendlyName { get; set; }
    public string ButtonName { get; set; }
    public bool Visable { get; set; }

    public List<Menu> CalculateMenuAccessForUser(User userDetails)
    {
        var menuItems = AllMenuItemsInSystem();

        foreach (var pt in userDetails.PermissionTable)
        {
            if(pt.Type != "Menu")
                break;

            if (menuItems.Exists(x => x.Id.Equals(pt.Id)))
            {
                var index = menuItems.FindIndex(y => y.Id.Equals(pt.Id));

                menuItems[index].Visable = true;
            }
        }

        return menuItems;
    }

    private List<Menu> AllMenuItemsInSystem()
    {
        var menu = new List<Menu>();

        using (var sqlconnection = new SqlConnection(Globals.AFWideSettings.SqlConnectionString))
        {
            sqlconnection.Open();
            using (
                var sqlcommand =
                    new SqlCommand("select name, permissionid from PermissionListTable where type = 'Menu'",
                                   sqlconnection))
            {
                var resultReader = sqlcommand.ExecuteReader();

                while (resultReader.Read())
                {
                    menu.Add(new Menu(){MenuItemFriendlyName = resultReader.GetString(0), Id = resultReader.GetInt32(1), Visable = false});
                }
            }
        }

        return menu;
    }
}

class Another{

    void BuildOutlookMenu()
    {
        var buildMenu = new Authentication.Menu();
        var menuBuilder = buildMenu.CalculateMenuAccessForUser(_userDetails);

        foreach (var menu in menuBuilder)
        {
            if (menu.Visable)
            {
                //Here I wish to enable or disable my menu buttons
                //BUTTON.Visibility = Visibility.Visible;
            }                
        }
    }
}
4

1 に答える 1

0

何らかの形で各ボタンをメニューに関連付ける必要があります。おそらく、Tagプロパティを使用してボタンにインデックスを割り当て、リストを作成してボタンをそれに割り当て、それを繰り返して表示するかどうかを決定しますいいえ。Buttons インデックスをメニュー項目のプロパティに関連付ける必要があります (MenuButtons という名前のリストの例としてタグを使用しました)。

foreach (var menu in menuBuilder)
{
    if (menu.Visible)
    {
        Button result =  menuButtons.Find(btn => { return (int)btn.Tag == (int)menu.Tag;});
        if(result != null){result.Visibility=Visibility.Visible;}
    }
}
于 2012-12-30T23:18:26.070 に答える