Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除动态创建的树视图项_C#_Wpf_Treeview_Treeviewitem - Fatal编程技术网

C# 如何删除动态创建的树视图项

C# 如何删除动态创建的树视图项,c#,wpf,treeview,treeviewitem,C#,Wpf,Treeview,Treeviewitem,我有一个WPF应用程序,允许用户在treeview中动态创建子项。这些子项从单独的窗口创建,并添加到主窗口。我还想实现一个delete方法,从一个单独的窗口中删除主窗口子项 以下是我的想法和一些代码: //Okay button -- Delete sub-items in main window TreeView private void button2_Click(object sender, RoutedEventArgs e) { //Query for Window1

我有一个WPF应用程序,允许用户在
treeview
中动态创建子项。这些子项从单独的窗口创建,并添加到主窗口。我还想实现一个delete方法,从一个单独的窗口中删除主窗口子项

以下是我的想法和一些代码:

//Okay button -- Delete sub-items in main window TreeView
private void button2_Click(object sender, RoutedEventArgs e)
{
    //Query for Window1
    var mainWindow = Application.Current.Windows
        .Cast<Window1>()
        .FirstOrDefault(window => window is Window1) as Window1;

    //Name of header that needs to be located
    string header = textBox1.Text;

    //While treeview from main window contains subitems
    while (!mainWindow.treeView.Items.IsEmpty)
    {
        //Find TreeView subitem with matching header
        //? - not sure on code

        //Delete TreeView subitem
        //I'm guessing it has something to do with
        //mainWindow.treeView.Items.Remove(At?)....
    }
}
Buld错误

错误1:与“…(项目)…”匹配的最佳重载方法具有一些无效参数

错误2:参数“1”:无法从
System.Windows.Controls.treevieItem
转换为“System.Windows.Controls.ItemCollection”

多谢各位

公共部分类主窗口:窗口
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        string header = txtRemove.Text; //name of Treeviewitem to delete
        TreeView view = trvView; //get from location

        RemoveAll(view.Items, p => string.Equals(p.Header, header));
    }

    public bool Remove(ItemCollection items, Predicate<TreeViewItem> isValid)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            TreeViewItem vItem = (TreeViewItem)items[i];
            if (isValid(vItem))
            {
                items.RemoveAt(i);
                return true;
            }
            else
            {
                bool isDeleted = Remove(vItem.Items, isValid);
                if (isDeleted)
                    return isDeleted;
            }
        }
        return false;
    }

    public void RemoveAll(ItemCollection items, Predicate<TreeViewItem> isValid)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            TreeViewItem vItem = (TreeViewItem)items[i];
            if (isValid(vItem))
            {
                items.RemoveAt(i);
            }
            else
            {
                RemoveAll(vItem.Items, isValid);
            }
        }
    }

}
{ 公共主窗口() { 初始化组件(); } 私有无效按钮\u单击\u 1(对象发送者,路由目标) { string header=txtRemove.Text;//要删除的Treeviewitem的名称 TreeView view=trvView;//从位置获取 RemoveAll(view.Items,p=>string.Equals(p.Header,Header)); } public bool Remove(ItemCollection项,谓词isValid) { 对于(int i=items.Count-1;i>=0;i--) { TreeViewItem vItem=(TreeViewItem)项[i]; 如果(是有效的(vItem)) { 项目.删除(i); 返回true; } 其他的 { bool isDeleted=删除(vItem.Items,isValid); 如果(已删除) 返回被删除; } } 返回false; } public void RemoveAll(ItemCollection项,谓词isValid) { 对于(int i=items.Count-1;i>=0;i--) { TreeViewItem vItem=(TreeViewItem)项[i]; 如果(是有效的(vItem)) { 项目.删除(i); } 其他的 { RemoveAll(vItem.Items,有效); } } } }
///Xaml

<Window x:Class="TreeViewSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView x:Name="trvView" HorizontalAlignment="Left" Height="215" Margin="68,35,0,0" VerticalAlignment="Top" Width="221">
            <TreeView.Items>
                <TreeViewItem Header="1">
                    <TreeViewItem Header="1/1"/>
                    <TreeViewItem Header="1/2"/>
                    <TreeViewItem Header="1/3"/>
                </TreeViewItem>
                <TreeViewItem Header="2">
                    <TreeViewItem Header="2/1"/>
                    <TreeViewItem Header="2/2"/>
                    <TreeViewItem Header="2/3"/>
                </TreeViewItem>
                <TreeViewItem Header="3">
                    <TreeViewItem Header="3/1"/>
                    <TreeViewItem Header="3/2"/>
                    <TreeViewItem Header="3/3"/>
                </TreeViewItem>
            </TreeView.Items>

        </TreeView>
        <Button  Content="Button" HorizontalAlignment="Left" Margin="333,155,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <TextBox x:Name="txtRemove" HorizontalAlignment="Left" Height="23" Margin="333,102,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>


我通过
try
catch
解决了我的错误。该程序现在正在运行,但它将清除
树视图下的所有内容,而不是指定的子项。有没有一种方法可以演示如何隔离要删除的选定子项?有关此答案的几个问题:我是否要从我的
按钮中调用此方法?单击
eventHandler
?我需要实例化什么并传递给该方法(我猜我再次查询我的
main窗口
,并传递我正在使用的
TreeView
)?您可以从“按钮点击事件处理程序”调用该方法,但编写代码时假设您正在维护一个“列表”,即您的“toDelete”。“项目”部分是TreeView.items字段。如何确定要删除的字段?存储的要删除的TreeView项列表,或者每个TreeView项是否都有复选框?如果是后者,你也应该看看我刚才正试图根据
标题删除它们。用户输入
树视图项
标题
,然后程序用相应的
标题
删除该项。好的,我认为第一种方法对我来说是最清楚的。我只是不知道如何为我的
删除
项目维护
列表。
treeViewItems
没有复选框。对不起,我是WPF的新手,虽然我了解我所做的很多事情,但这个问题对我来说有点复杂。
<Window x:Class="TreeViewSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView x:Name="trvView" HorizontalAlignment="Left" Height="215" Margin="68,35,0,0" VerticalAlignment="Top" Width="221">
            <TreeView.Items>
                <TreeViewItem Header="1">
                    <TreeViewItem Header="1/1"/>
                    <TreeViewItem Header="1/2"/>
                    <TreeViewItem Header="1/3"/>
                </TreeViewItem>
                <TreeViewItem Header="2">
                    <TreeViewItem Header="2/1"/>
                    <TreeViewItem Header="2/2"/>
                    <TreeViewItem Header="2/3"/>
                </TreeViewItem>
                <TreeViewItem Header="3">
                    <TreeViewItem Header="3/1"/>
                    <TreeViewItem Header="3/2"/>
                    <TreeViewItem Header="3/3"/>
                </TreeViewItem>
            </TreeView.Items>

        </TreeView>
        <Button  Content="Button" HorizontalAlignment="Left" Margin="333,155,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <TextBox x:Name="txtRemove" HorizontalAlignment="Left" Height="23" Margin="333,102,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>