【问题标题】:Populate TreeView from another class (or something better?) C#从另一个类(或更好的东西?)C# 填充 TreeView
【发布时间】:2012-09-15 11:00:18
【问题描述】:

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

关卡文件的前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] 是我想访问的内容(我正在尝试访问 Mesh 版本)http://i.imgur.com/hahhG.png

所以我需要做的是访问该 PRE EXISTING NODE 并向其添加一个子节点。在这种情况下,我似乎找不到任何详细说明它的教程,而且我不明白它足以满足他们的教程以满足我的需要。

非常感谢。

【问题讨论】:

  • @Saeid87 好吧,我是 c# 新手,所以我认为引用它的方法是“Levelreader.Form1.treeView1.dostuff”,在 form1 类“treeView1.dostuff”中有效。但在课堂之外,它说它不存在。你能澄清一下吗?
  • Mesh 版本节点为treeView1.Nodes[1].Nodes[0].Nodes[0]

标签: c# winforms treeview


【解决方案1】:

三种解决方案:

  1. 您可以将 Form1.Designer.cs 中 TreeView 的可见性更改为 public 或 internal

  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)

【讨论】:

  • 谢谢,它有效。我试图找到一些代码来允许预先存在的节点数量;也就是说,已经在设计器视图中创建的节点。我似乎找到的所有教程都需要在您正在使用的方法中创建一个节点,这不是我想要做的。因此,我似乎无法找到填充预先存在的节点的方法。如果可能的话,我会更新我的问题,如果你愿意,你能告诉我如何填充节点吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多