私はC#が初めてで、プログラミングの経験はありません。しかし、C#の基本は終了しました。次に、親ノードと子ノードを追加して、単純なツリービューを設計します。
2番目のノードに2番目の子を追加したいのですが、ここで非常に行き詰まっていて、次に何が起こるかわかりません。
何か案は?
コードは次のとおりです。
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();
私がやろうとしているのは、親ノードと子ノードを追加することです。私のコードでは、複数の親ノードを追加できますが、子ノードを追加する場合は、最初の親ノードのみを追加します。子ノードを追加する場合、2番目の親または3番目の親に追加したいです。
私のコードでは、treeview2という名前のツリービューを1つだけ使用しています。ここに 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」を2回宣言しているためです。 ifに1つ、elseに1つ、単純化はありますか?
それほど悪くはありませんが、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つのTreeViewがありました。 TreeViewを1つに変更しました...
編集:追加の質問への回答:
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 を参照してください。オペレーター。
Stormenetの例にいくつかのKISS(Keep It Simple&Stupid):
すでにtreeViewがある場合、またはそのインスタンスを作成したばかりの場合:いくつかのデータを入力しましょう-例。 1つの親2つの子:
treeView1.Nodes.Add("ParentKey","Parent Text");
treeView1.Nodes["ParentKey"].Nodes.Add("Child-1 Text");
treeView1.Nodes["ParentKey"].Nodes.Add("Child-2 Text");
別の例。 2人の親の最初の子には2人の子の2番目の子が1人います。
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");
あなたが見るように、あなたはあなたが望むだけ多くの子供と親を持つことができ、それらは子の子などを持つことができます....私は助けてくれることを願っています!
最初の親にのみ子を追加しているようですtreeView2.Nodes[0].Nodes.Add(yourChildNode)
動作方法に応じて、子を追加する親ノードについて明示する必要があります。
たとえば、スクリーンショットから、子を2番目のノードに追加する場合は、次が必要です。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
}
}
子ノードを追加する例:
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");
}
私は似たようなことをする必要があり、同じ問題に出くわしました。 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);
}
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);
}
}
そのコードを改善できます
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());
}
}
}
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);
}
}
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
}
}