我是C#的新手,没有任何编程经验。但我已经完成了C#基础知识。 现在我想通过添加父节点和子节点来设计一个简单的树视图。
我想为第二个节点添加第二个孩子,我很困扰这里,不知道下一个是什么。
有什么想法吗?
以下是代码:
private void addParentNode_Click(object sender, EventArgs e)
{
string yourParentNode;
yourParentNode = textBox1.Text.Trim();
treeView2.Nodes.Add(yourParentNode);
}
private void addChildNode_Click(object sender, EventArgs e)
{
string yourChildNode;
yourChildNode = textBox1.Text.Trim();
treeView2.Nodes[0].Nodes.Add(yourChildNode);
}
抱歉,我不清楚,我不确定我是否真的需要这个:
//treeView1.BeginUpdate();
//treeView1.Nodes.Clear();
我正在尝试做的是添加父节点和子节点。在我的代码中,我可以添加几个父节点,但如果我想添加一个子节点,它只会添加在第一个父节点中。 我希望如果我添加一个子节点,我想将它添加到第二个父节点或第三个父节点。
在我的代码中,我只使用一个树视图,其名称为treeview2 这是screenshot
这是我最终代码的样子: 在我放其他之前,如果我没有选择任何东西,我会收到错误。所以我这样做是因为如果没有选择它,它会将“子节点”添加到“默认节点”或(parent1节点)。它似乎运作良好。谢谢你们; - )
//This is for adding a parent node
private void addParentNode_Click(object sender, EventArgs e)
{
treeView2.BeginUpdate();
string yourParentNode;
yourParentNode = textBox1.Text.Trim();
treeView2.Nodes.Add(yourParentNode);
treeView2.EndUpdate();
}
//This is for adding child node
private void addChildNode_Click(object sender, EventArgs e)
{
if (treeView2.SelectedNode != null)
{
string yourChildNode;
yourChildNode = textBox1.Text.Trim();
treeView2.SelectedNode.Nodes.Add(yourChildNode);
treeView2.ExpandAll();
}
//This is for adding the child node to the default node(parent 1 node)
else
{
string yourChildNode;
yourChildNode = textBox1.Text.Trim();
treeView2.Nodes[0].Nodes.Add(yourChildNode);
}
其他问题:关于代码如何更好,还有其他方法吗?因为在这里,我声明字符串“yourChildNode”两次。在if中的if和其他的一个,是否有任何简化?
答案 0 :(得分:21)
这并不是那么糟糕,但您忘记在treeView2.EndUpdate()
方法中拨打addParentNode_Click()
了。
您也可以在treeView2.ExpandAll()
方法的末尾调用addChildNode_Click()
直接查看您的子节点。
private void addParentNode_Click(object sender, EventArgs e) {
treeView2.BeginUpdate();
//treeView2.Nodes.Clear();
string yourParentNode;
yourParentNode = textBox1.Text.Trim();
treeView2.Nodes.Add(yourParentNode);
treeView2.EndUpdate();
}
private void addChildNode_Click(object sender, EventArgs e) {
if (treeView2.SelectedNode != null) {
string yourChildNode;
yourChildNode = textBox1.Text.Trim();
treeView2.SelectedNode.Nodes.Add(yourChildNode);
treeView2.ExpandAll();
}
}
我不知道这是不是错了,但有2个TreeViews。我把它改成只有1个TreeView ......
编辑:回答其他问题:
您可以声明保存子节点名称的变量在if子句之外:
private void addChildNode_Click(object sender, EventArgs e) {
var childNode = textBox1.Text.Trim();
if (!string.IsNullOrEmpty(childNode)) {
TreeNode parentNode = treeView2.SelectedNode ?? treeView2.Nodes[0];
if (parentNode != null) {
parentNode.Nodes.Add(childNode);
treeView2.ExpandAll();
}
}
}
注意:有关信息,请参阅http://www.yoda.arachsys.com/csharp/csharp2/nullable.html。操作
答案 1 :(得分:11)
我可以在Stormenet示例中添加一些KISS(Keep It Simple& Stupid):
如果您已经有一个treeView或只是创建了它的一个实例: 让我们填充一些数据 - 例如。一位父母两个孩子:
treeView1.Nodes.Add("ParentKey","Parent Text");
treeView1.Nodes["ParentKey"].Nodes.Add("Child-1 Text");
treeView1.Nodes["ParentKey"].Nodes.Add("Child-2 Text");
另一个例子。两个父母的第一个有两个孩子的第二个孩子:
treeView1.Nodes.Add("ParentKey1","Parent-1 Text");
treeView1.Nodes.Add("ParentKey2","Parent-2 Text");
treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text");
treeView1.Nodes["ParentKey1"].Nodes.Add("Child-2 Text");
treeView1.Nodes["ParentKey2"].Nodes.Add("Child-3 Text");
如果孩子2的孩子更远 -
treeView1.Nodes.Add("ParentKey1","Parent-1 Text");
treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text");
treeView1.Nodes["ParentKey1"].Nodes.Add("ChildKey2","Child-2 Text");
treeView1.Nodes["ParentKey1"].Nodes["ChildKey2"].Nodes.Add("Child-3 Text");
如你所见,你可以拥有你想要的尽可能多的孩子和父母,那些可以有孩子的子孩子等等...... 希望我帮忙!
答案 2 :(得分:2)
添加子节点的示例:
private void AddExampleNodes()
{
TreeNode node;
node = treeView1.Nodes.Add("Master node");
node.Nodes.Add("Child node");
node.Nodes.Add("Child node 2");
node = treeView1.Nodes.Add("Master node 2");
node.Nodes.Add("mychild");
node.Nodes.Add("mychild");
}
答案 3 :(得分:2)
看起来您只是将孩子添加到第一位父级treeView2.Nodes[0].Nodes.Add(yourChildNode)
根据您希望它的行为方式,您需要明确要将子项添加到的父节点
例如,从屏幕截图中,如果要将子项添加到第二个节点,则需要:
treeView2.Nodes[1].Nodes.Add(yourChildNode)
如果要将子项添加到当前选定的节点,请获取TreeView.SelectedNode
并将子项添加到其中。
尝试TreeView以了解班级的运作方式。不幸的是,msdn文档对代码示例非常清楚...
我在这里错过了很多安全检查!
像(未经测试)的东西:
private void addChildNode_Click(object sender, EventArgs e) {
TreeNode ParentNode = treeView2.SelectedNode; // for ease of debugging!
if (ParentNode != null) {
ParentNode.Nodes.Add("Name Of Node");
treeView2.ExpandAll(); // so you can see what's been added
treeView2.Invalidate(); // requests a redraw
}
}
答案 4 :(得分:1)
我需要做类似的事情并遇到同样的问题。我使用AfterSelect事件来确保我没有获得先前选择的节点。
实际上很容易引用正确的节点来接收新的子节点。
private void TreeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
//show dialogbox to let user name the new node
frmDialogInput f = new frmDialogInput();
f.ShowDialog();
//find the node that was selected
TreeNode myNode = TreeView1.SelectedNode;
//create the new node to add
TreeNode newNode = new TreeNode(f.EnteredText);
//add the new child to the selected node
myNode.Nodes.Add(newNode);
}
答案 5 :(得分:0)
void treeView(string [] LineString)
{
int line = LineString.Length;
string AssmMark = "";
string PartMark = "";
TreeNode aNode;
TreeNode pNode;
for ( int i=0 ; i<line ; i++){
string sLine = LineString[i];
if ( sLine.StartsWith("ASSEMBLY:") ){
sLine = sLine.Replace("ASSEMBLY:","");
string[] aData = sLine.Split(new char[] {','});
AssmMark = aData[0].Trim();
//TreeNode aNode;
//aNode = new TreeNode(AssmMark);
treeView1.Nodes.Add(AssmMark,AssmMark);
}
if( sLine.Trim().StartsWith("PART:") ){
sLine = sLine.Replace("PART:","");
string[] pData = sLine.Split(new char[] {','});
PartMark = pData[0].Trim();
pNode = new TreeNode(PartMark);
treeView1.Nodes[AssmMark].Nodes.Add(pNode);
}
}
答案 6 :(得分:0)
您可以执行以下操作,使用父节点和子节点填充treeView。还有父节点和子节点的显示和值成员:
arrayRoot = taskData.GetRocordForRoot(); // iterate through database table
for (int j = 0; j <arrayRoot.length; j++) {
TreeNode root = new TreeNode(); // Creating new root node
root.Text = "displayString";
root.Tag = "valueString";
treeView1.Nodes.Add(root); //Adding the root node
arrayChild = taskData.GetRocordForChild();// iterate through database table
for (int i = 0; i < arrayChild.length; i++) {
TreeNode child = new TreeNode(); // creating child node
child.Text = "displayString"
child.Tag = "valueString";
root.Nodes.Add(child); // adding child node
}
}
答案 7 :(得分:0)
SqlConnection con = new SqlConnection(@"Data Source=NIKOLAY;Initial Catalog=PlanZadanie;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
public void loadTree(TreeView tree)
{
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT [RAZDEL_ID],[NAME_RAZDEL] FROM [tbl_RAZDEL]";
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
tree.Nodes.Add(reader.GetString(1));
tree.Nodes[0].Nodes.Add("yourChildNode");
tree.ExpandAll();
}
con.Close();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка с сообщением: " + ex.Message);
}
}
答案 8 :(得分:0)
您可以改进该代码
private void Form1_Load(object sender, EventArgs e)
{
/*
D:\root\Project1\A\A.pdf
D:\root\Project1\B\t.pdf
D:\root\Project2\c.pdf
*/
List<string> n = new List<string>();
List<string> kn = new List<string>();
n = Directory.GetFiles(@"D:\root\", "*.*", SearchOption.AllDirectories).ToList();
kn = Directory.GetDirectories(@"D:\root\", "*.*", SearchOption.AllDirectories).ToList();
foreach (var item in kn)
{
treeView1.Nodes.Add(item.ToString());
}
for (int i = 0; i < treeView1.Nodes.Count; i++)
{
n = Directory.GetFiles(treeView1.Nodes[i].Text, "*.*", SearchOption.AllDirectories).ToList();
for (int zik = 0; zik < n.Count; zik++)
{
treeView1.Nodes[i].Nodes.Add(n[zik].ToString());
}
}
}
答案 9 :(得分:-1)
伙伴们使用此代码从C#代码中为TreeView添加节点和子节点。 *
KISS(保持简单和愚蠢:)*
protected void Button1_Click(object sender,EventArgs e)
{
TreeNode a1 = new TreeNode("Apple");
TreeNode b1 = new TreeNode("Banana");
TreeNode a2 = new TreeNode("gree apple");
TreeView2.Nodes.Add(a1);
TreeView2.Nodes.Add(b1);
a1.ChildNodes.Add(a2);
}