C# 如何删除动态创建的树视图项
我有一个WPF应用程序,允许用户在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
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>