【问题标题】:C# Calling on a Class for a to-do listC# 调用一个待办事项列表的类
【发布时间】:2012-02-01 18:21:21
【问题描述】:

我被要求编写一个单独的类来做某事,所以我想我会为待办事项列表执行此操作(使用文本框将数据输入到列表中,然后为已完成的任务创建另一个列表,使用按钮之间转移)。

我已经能够将数据添加到我的待办事项列表中,并且我的代码将成功地从待办事项列表中删除,并通过单击按钮将其放入“完成”列表中。

当我把它放在一个新类中时,我的代码不起作用。

这是新类的代码:

public class ToDo : Form1

    {
        public void Remove()
        {

            for (int i = 0; i <= (lstToDo.SelectedItems.Count - 1); i++)
            {

                lstDone.Items.Add(lstToDo.SelectedItems[i]);
                lstToDo.Items.Remove(lstToDo.SelectedItems[i]);

            }
        }
    }

这是来自 Form1 的代码,当我单击按钮时,我想我正在尝试调用它:

public void btnRemoveToDo_Click(object sender, EventArgs e)
        {

            ToDo todo = new ToDo();
            todo.Remove();
        }

有什么帮助吗?

【问题讨论】:

  • 您可能想阅读一些有关面向对象 (OO) 编程的知识;这将帮助您了解为什么您尝试的方法不起作用。

标签: c# winforms class oop


【解决方案1】:

您正在创建ToDo 类的新实例,它不会从您原来的Form1 中继承您选择的项目。我怀疑在线:

        for (int i = 0; i <= (lstToDo.SelectedItems.Count - 1); i++)

lstToDo.SelectedItems 可能为空。

没有看到你所有的代码,很难提供好的建议,但ToDo 类可能不需要扩展Form1ToDo 类应在内部包含您的所有任务,并跟踪已完成的任务,并且Form1 应具有用于显示数据的 ToDo 的 1 个实例。

【讨论】:

  • 如果我不使用“ToDo : Form1”,ToDo 类会抛出错误,提示列表框不存在。
  • 正确,因为 ToDo 不应访问用户界面中的列表框。 Form1 应该负责将待办事项列表中的数据绑定到用户界面。否则,没有理由将您拥有的 Remove() 方法移动到单独的 ToDo 类中。如果 Remove() 将与用户界面交互,特别是列表框,那么 Remove() 应该在 Form1 中。在这种情况下,没有理由有一个 ToDo。这可能归结为您处理问题和思考面向对象设计的方式。
  • 这样想; ToDo 类管理一个待办事项列表。至于任务,什么已完成或未完成。 Form1 正在管理将 ToDo 列表的信息与用户相关联,而不是管理实际的 ToDo 列表。那里有一个关注点分离。 Form1 关注数据的显示,ToDo 关注表示列表。
  • 非常感谢您为我清理了很多东西,我会解决它并为其他东西创建一个类!非常感谢!
【解决方案2】:

在你把它移到新类之前,我想你的方法看起来像......

public void btnRemoveToDo_Click(object sender, EventArgs e)
{
    this.Remove();
}

当你把它移到一个新的类中时,你把代码改成了...

ToDo todo = new ToDo();
todo.Remove();

这是创建类的实例。要使其工作,您必须使用现有实例; this 就这样...

ToDO todo = (ToDo) this;
todo.Remove();

这也不是真正的最佳选择,因为它是一个非常尴尬的架构。您最好将利用表单组件的方法留在表单类本身上。如果您希望方法处理数据,请从表单的组件中提取值,然后将数据用作不同类方法的参数。这更多是对一般软件架构的评论,但对您的具体问题并不重要。

编辑
将 Form 实例 (this) 转换为 ToDo 实例将不起作用,因为 Form1 没有从 ToDo 继承,如评论所述。

现在最好将Remove() 方法移回Form1 类。我的建议是在尝试将其他任何内容分解为不同的类之前,尝试更多地了解对象和面向对象编程 (OOP)。

您可以尝试的另一件事是让ToDo 类上的Remove() 方法接受它需要的任何参数作为参数。

public void Remove(ListControl todoList, ListControl doneList)
{
    for (int i = 0; i <= (todoList.SelectedItems.Count - 1); i++)
    {
        doneList.Items.Add(todoList.SelectedItems[i]);
        todoList.Items.Remove(todoList.SelectedItems[i]);
    }
}

那么你必须让你的其他方法看起来像这样......

public void btnRemoveToDo_Click(object sender, EventArgs e)
{
    ToDo toDo = new ToDo();
    toDo.Remove(lstToDo, lstDone);
}

【讨论】:

  • 当我把它改成“(ToDo) this;”当我尝试从待办事项列表中删除并添加到已完成列表时,它给了我一个错误,错误说:无法将“Coursework_Program.Form1”类型的对象转换为“Coursework_program.ToDo”类型。
  • @Chrisosaurus - 我已经编辑了我的答案以解决您的评论。
  • 感谢您的帮助,不幸的是它仍然对我不起作用,所以我将解决这个问题并为其他东西创建一个类!非常感谢!
  • 没关系,你的代码在修改了一些东西后正常运行,我自己的错,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多