从另一个类填充TreeView(或更好的东西?)C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从另一个类填充TreeView(或更好的东西?)C#相关的知识,希望对你有一定的参考价值。

我正在尝试为我最喜欢的游戏制作一个关卡阅读器应用程序,并简单地说这就是我目前正在尝试实现的目标:

级别文件的前8个字节:

0100000001000000

它声明网格版本= 1,顶点版本= 1。

我已经制作了一个GUI,其中我有一个树视图,在树中它有标题,在标题中它有顶点和网格版本。我想用这些数据填充这些数据。

现在这是我的第一个问题出现的地方: 我希望所有的阅读都在自己的类中完成(例如,HeaderData,MaterialData)等,只是为了使代码更清晰。因为我在另一堂课里这样做, 我不知道如何从所述类访问我的树视图(如果我在Form类中我可以做treeView1.whatever,但我不知道如何从另一个类访问它。 注意:我已经尝试过Levelreader.Form1.treeView1,但它不存在)。

public void button1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog fileDialog = new OpenFileDialog())
    {
        if (fileDialog.ShowDialog() != DialogResult.Cancel)
        {
            textBox1.Text = fileDialog.FileName;
            using (BinaryReader fileBytes = new BinaryReader(new MemoryStream(File.ReadAllBytes(textBox1.Text))))
            {
                //Get the hex data in bytearray format
                //This won't be displayed
                int length = (int)fileBytes.BaseStream.Length;
                byte[] hex = fileBytes.ReadBytes(length);
                //File.WriteAllBytes(@"c:\temp_file.txt", hex);

                //This is what's displayed.
                //Remember to make changes to the byte array
                //and then update the view.
                string tempStr = BitConverter.ToString(hex).Replace("-", " ");
                richTextBox1.Text = tempStr;
                richTextBox1.ScrollBars = RichTextBoxScrollBars.ForcedVertical;

                //Instantiate the class
                Header temp = new Header();
                temp.HeaderData(hex);
                }
            }
        }

    }

这是在Form1类中,在名称空间LevelReader中的方法,它读取文件然后实例化类Header()。然后我调用HeaderData,在该类中我得到了网格和顶点版本。

namespace SceneStuff
{
    public class Header
    {

        public void HeaderData(byte[] hex)
        {
            //First 4 Bytes = Mesh Version
            //Second 4 Bytes = Vertex Version
            byte[] meshVersion = hex.Take(4).ToArray();
            byte[] vertexVersion = hex.Skip(4).Take(4).ToArray();

        }

    }
}

在这个方法中,我想使用这些数据来填充我的树视图。比如说我改变了关卡中的一些信息,例如将网格版本更改为2,我想,当我按下“编译级别”(在我的应用程序GUI中)从TreeView中读取时,我相信它会是最好的那样。但是,如果您有任何建议,请说明,因为我是c#的新手! 总而言之,这是我的两个问题: 1)如何从另一个命名空间/类访问我的树视图? 2)您有什么建议来改进我的代码吗? (以及我计划编译我的关卡的方式?) 谢谢! 附:我为文字墙道歉! > _ <

编辑:

我有另一个问题,就是我似乎无法填充我的节点。

它是这样创建的:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Mesh Version");

及以下:

        treeNode2.Name = "meshVersion";
        treeNode2.Text = "Mesh Version";

我已经尝试添加treeNode2作为我的方法的引用,但这不起作用。 我试图用treeView1.SelectedNode = treeView1.Nodes[1].Nodes[1];选择它,但这似乎也不起作用。 (这是GUI的图像,显​​示Nodes[1].Nodes[1],我想,我正在尝试访问(我正在尝试访问网格版)http://i.imgur.com/hahhG.png 所以我需要做的是访问PRE EXISTING NODE并为其添加一个子节点。在这些情况下,我似乎无法找到任何详细说明的教程,我不明白它是否足以满足我的需求。

非常感谢。

答案

Three Solutions :

  1. 您可以将Form1.Designer.cs中TreeView的可见性更改为publicinternal
  2. 或者您可以在HeaderData()函数内构建TreeView节点并返回它们。
  3. 或者如@Saeid87所说,您可以通过引用HeaderData()函数传递TreeView:

示例:

public void HeaderData(byte[] hex, ref TreeView treeview)
{
    //First 4 Bytes = Mesh Version
    //Second 4 Bytes = Vertex Version
    byte[] meshVersion = hex.Take(4).ToArray();
    byte[] vertexVersion = hex.Skip(4).Take(4).ToArray();

    //Example: Do something with the Mesh Version Node
    treeView1.Nodes[1].Nodes[0].Nodes[0].Text = "Lorem ipsum";
}

当你调用你的函数时,通过引用传递TreeView(在你的button1_Click函数内)

temp.HeaderData(hex, ref treeView1)

以上是关于从另一个类填充TreeView(或更好的东西?)C#的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TreeView 中禁用或修改 TreeCell 的填充

如何从另一个类引用当前或主要活动

如何通过获取nodes.text并设置为true或false来填充Treeview node.checked为true或false

列表从另一个列表中选择正则表达式

如何使用 Tkinter 清除整个 Treeview

在 .NET 中延迟加载 TreeView