Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在UI更改时正确导航对象列表?_C#_Winforms - Fatal编程技术网

C# 如何在UI更改时正确导航对象列表?

C# 如何在UI更改时正确导航对象列表?,c#,winforms,C#,Winforms,我有一个自定义控件,包含一个TreeView、一个带有几个按钮的Toolstrip和一个文本框 然后我有一个类Issue,它有一些string和bool属性(最重要的是string ID和string[]files),还有一个Projects类,其中包含2个List、一些其他属性和一些与列表交互的方法 TreeView将Project.ID显示为“父”节点,将Issue.ID显示为“子”节点。文本框显示当前所选问题子节点的文件属性 当用户在树视图中选择不同的项目时,我真的不知道应该如何导航我的项

我有一个自定义控件,包含一个TreeView、一个带有几个按钮的Toolstrip和一个文本框

然后我有一个类
Issue
,它有一些
string
bool
属性(最重要的是
string ID
string[]files
),还有一个
Projects
类,其中包含2个
List
、一些其他属性和一些与列表交互的方法

TreeView
Project.ID
显示为“父”节点,将
Issue.ID
显示为“子”节点。
文本框
显示当前所选
问题
子节点的
文件
属性

当用户在
树视图
中选择不同的项目时,我真的不知道应该如何导航我的
项目.IssueList1
项目.IssueList2
,同时读取/写入数据

目前,在
TreeView\u AfterSelect
事件中,我在列表中找到
Issue
,设置
textbox1.Lines=Issue.files
,然后在
Textbox\u TextChanged
事件中,我将
Lines
值分配回
Issue.files
。这是功能性的,一切正常,但我不喜欢。它让人感觉邋遢和“粗糙”

99.9%的情况下,用户会将一个或多个文件路径复制粘贴到UI中,所以这不像每次他们键入内容时都会触发事件,但我仍然不喜欢这种方法


有没有办法将控件绑定到对象,并让框架负责遍历列表和更新UI?我想这就是ORM的目的,但我不确定是否有类似的内置解决方案。

这是我实现的完整解决方案,希望对您有用

此解决方案基于使用
BindingSource
及其
DataSource
DataMember
属性来创建主详细数据绑定和

以下是步骤:

1-定义您的课程

public class Project
{
    public string Id { get; set; }
    public List<Issue> Issues { get; set; }
}

public class Issue
{
    public string IssueId { get; set; }
    public List<IssueFile> Files { get; set; }
}

public class IssueFile
{
    public string Name { get; set; }
}
4-处理树的余选事件
处理树的
AfterSelect
事件,如果所选节点是问题节点,则设置绑定源的当前项:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (e.Node.Parent != null)
    {
        var project = e.Node.Parent.Tag as Project;
        this.projectBindingSource.Position = this.projectBindingSource.IndexOf(project);

        var issue = e.Node.Tag as Issue;
        this.issuesBindingSource.Position = this.issuesBindingSource.IndexOf(issue);
    }
}
5-截图


我认为文本框可能是您的
字符串[]文件的错误用户控件。一种方法是对文件使用
BindingList
Listbox
作为控件,然后将
BindingList
设置为
Listbox
Datasource
。我必须查看
BindingList
,我不熟悉该对象。我只是选择了
文本框
,因为它似乎是最简单、最“自由”的数据输入形式。该应用程序的一般用途是简单地从SVN提交日志复制文件列表,并将其粘贴到应用程序中,作为更新部署实用程序的一部分。这篇文章似乎回答了您的问题,如果您将其标记为已接受并投赞成票,那就太好了:)@RezaAghaei抱歉!我被解雇了,忘了回来接受。谢谢你的反馈:)哇,非常感谢。很长的帖子。在我开始实际测试这条路线之前需要一点时间,因为我还有一些事情需要首先处理,但再次感谢。
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (e.Node.Parent != null)
    {
        var project = e.Node.Parent.Tag as Project;
        this.projectBindingSource.Position = this.projectBindingSource.IndexOf(project);

        var issue = e.Node.Tag as Issue;
        this.issuesBindingSource.Position = this.issuesBindingSource.IndexOf(issue);
    }
}