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



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

级别文件的前8个字节:

0100000001000000

它表示网格版本=1,顶点版本=1。

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

这就是我的第一个问题:
我想在它自己的类(例如,HeaderData、MaterialData)中完成所有的阅读,等等,只是为了让代码更干净。因为我在另一个类中这样做,
我不知道如何从所述类访问我的树视图(如果我在Form类中,我可以只做treeView1.whatever,但我不知道怎样从另一个类别访问它。

注意:我试过Levelreader.Form1.reeView1,但它不存在)。

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();
}
}
}

在THIS方法中,我想使用这些数据来填充我的树视图。举个例子,当我按下"编译级别"(在我的应用程序GUI中)从TreeView中读取时,我更改了级别中的一些信息,比如将网格版本更改为2,我希望这样做是最好的。但是,如果你有建议,请说明,因为我是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版本)https://i.stack.imgur.com/Q8bGg.png


因此,我需要做的是访问PRE EXISTING NODE,并在其中添加一个孩子。在这种情况下,我似乎找不到任何详细的教程,我不知道它是否足以满足他们的教程以满足我的需求。

非常感谢。

三种解决方案:

  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)

最新更新