首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合设计模式

复合设计模式
EN

Stack Overflow用户
提问于 2016-11-18 03:17:15
回答 1查看 92关注 0票数 0

我有一个带有元素的ListBox,我需要显示这些元素,但是我想添加一个选项来删除所选的项,问题是.我删除了它,但我从列表框中删除,而不是从元素类中删除,我可以做什么从树中删除这些项?这是我的代码:

表格1:

代码语言:javascript
复制
private void btnBuildPartsList_Click(object sender, EventArgs e)
{
    Assembly topWidget = new Assembly("Main Assembly", 1);
    Assembly chassis = new Assembly("Chassis", 1);
    Assembly display = new Assembly("Display", 1);
    Assembly powerSupply = new Assembly("Power Supply", 1);
    Part bolt = new Part("Bolt", 24);
    Part mainCase = new Part("Case", 1);
    Part screen = new Part("Screen", 3);
    Part displayElectronics = new Part("Display Electronics", 3);
    Part transformer = new Part("Transformer", 1);
    Part powerBoard = new Part("Power Board", 1);
    Part ductTape = new Part("Duct Tape", 5);
    Part gum = new Part("Bubble Gum", 25);

    topWidget.Add(chassis);
    topWidget.Add(display);
    topWidget.Add(powerSupply);
    chassis.Add(mainCase);
    chassis.Add(bolt);
    display.Add(screen);
    display.Add(displayElectronics);
    powerSupply.Add(transformer);
    powerSupply.Add(powerBoard);
    topWidget.Add(ductTape);
    topWidget.Add(gum);

    DisplayPartsList(topWidget);
}

private void DisplayPartsList(Assembly topWidget)
{
     List<string> partsList = new List<string>();
     topWidget.WritePartsList(partsList);

     listParts.Items.Clear();
     listParts.Items.AddRange(partsList.ToArray());
}

这是我的大会课:

代码语言:javascript
复制
namespace Composite
{
    public class Assembly : BaseAssembly
    {
        private List<BaseAssembly> elements = new List<BaseAssembly>();

        public Assembly(string name, int quantity)
            : base(name, quantity)
        {
        }

        public override void Add(BaseAssembly assembly)
        {
            elements.Add(assembly);
        }

        public override void Remove(BaseAssembly assembly)
        {
            elements.Remove(assembly);
        }

        public override void WritePartsList(List<string> list)
        {
            list.Add(Quantity.ToString() + " - " + Name);

            foreach (BaseAssembly assembly in elements)
            {
                assembly.WritePartsList(list);
            }
        }
    }
}

我认为这段代码已经足够了,所有其他代码--就像其他复合设计模式代码中的代码--现在,我如何才能完成删除项函数呢?从我的列表框中选择x元素。正如我之前所说的,我要从the listbox中删除该项,但我想从所有类中删除它。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-19 17:21:48

我有一个解决方案,首先把这段代码作为全局变量:

代码语言:javascript
复制
Assembly topWidget = new Assembly("Main Assembly", 1);    
Assembly chassis = new Assembly("Chassis", 1);
Assembly display = new Assembly("Display", 1);    
Assembly powerSupply = new Assembly("Power Supply", 1);    
Part bolt = new Part("Bolt", 24);    
Part mainCase = new Part("Case", 1);
Part screen = new Part("Screen", 3);
Part displayElectronics = new Part("Display Electronics", 3);
Part transformer = new Part("Transformer", 1);
Part powerBoard = new Part("Power Board", 1);
Part ductTape = new Part("Duct Tape", 5);
Part gum = new Part("Bubble Gum", 25);

在此之后,您需要处理delete函数,您将如何处理呢?使用按钮还是只从列表框中选择元素?这取决于你,我会给你代码,然后你只会改变你所需要的。

您的元素具有这样的结构,例如:

一个 A,B A、B、C

在这种情况下,A是topWidget B是chassis, display, powerSupply,C是mainCase, bolt, screen, displayElectronics... etc,您可以选择要删除的信息,换句话说,如果您删除B element,您将删除所有的C elements too,所以您需要选择如果您只想删除一个C element或所有的B elements,您可以使用switch来完成这个操作,以及您需要发送什么?The selected item from the ListBox,但是,您的ListBox包含这样的项:24 - Bolt >对吗?然后,您只需要进行拆分就可以得到Bolt或其他任何东西。

代码语言:javascript
复制
var select = listParts.SelectedItem.ToString().IndexOf('-');
string selectVal = listParts.SelectedItem.ToString().Substring(select + 1).Trim();

这样,您将得到添加的相同字符串,您只需要处理switch并使用Remove函数,如下所示:

代码语言:javascript
复制
switch (selectVal)
{
   //This will remove all the elements of powerSupply (transformer, powerBoard )
   case "Power Supply":
      topWidget.Remove(powerSupply);
      break;
}

或者您可以这样做来删除C element one by one

代码语言:javascript
复制
switch (selectVal)
{
   //This will remove only "Transformer".
   case "Transformer":
      powerSupply.Remove(transformer);
      break;
}

请记住,在切换之后,您需要刷新ListBox (call again DisplayPartsList(topWidget);)

你可以把这两种情况结合起来,没有问题,希望这对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档