我正在尝试编写一个可用于我的应用程序的SortableBindingList.我发现了很多关于如何实现基本排序支持的讨论,以便BindingList在DataGridView或其他绑定控件的上下文中使用时进行排序,包括来自StackOverflow的这篇文章:
DataGridView排序和例如.NET中的BindingList <T>
这一切都非常有用,我已经实现了代码,经过测试等等,并且一切正常,但在我的特殊情况下,我需要能够支持对Sort()的简单调用,并让该调用使用默认的IComparable. CompareTo()进行排序,而不是调用ApplySortCore(PropertyDescriptor,ListSortDirection).
原因是因为我有很多代码依赖于Sort()调用,因为这个特定的类最初是从List继承的,最近被改为BindingList.
具体来说,我有一个名为VariableCode的类和一个名为VariableCodeList的集合类.VariableCode实现IComparable,其中的逻辑基于几个属性等适度复杂...
public class VariableCode : ... IComparable ...
{
public int CompareTo(object p_Target)
{
int output = 0;
//some interesting stuff here
return output;
}
}
public class VariableCodeList : SortableBindingList<VariableCode>
{
public void Sort()
{
//This is where I need help
// How do I sort this list using the IComparable
// logic from the class above?
}
}
Run Code Online (Sandbox Code Playgroud)
我在Sort()中重新调整了ApplySortCore方法的尝试失败了,但是阻止我的是,ApplySortCore期望PropertyDescriptor进行排序,我无法弄清楚如何使用IComparable .CompareTo()逻辑.
有人能指出我正确的方向吗?
非常感谢.
编辑:这是基于Marc的回复的最终代码,供将来参考.
/// <summary>
/// Sorts using the default IComparer of …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何在ListView中以编程方式选择项目.
我正在尝试使用listview的ItemContainerGenerator,但它似乎不起作用.例如,在以下操作之后obj为null:
//VariableList is derived from BindingList
m_VariableList = getVariableList();
lstVariable_Selected.ItemsSource = m_VariableList;
var obj =
lstVariable_Selected.ItemContainerGenerator.ContainerFromItem(m_VariableList[0]);
Run Code Online (Sandbox Code Playgroud)
我已经尝试过(基于此处和其他地方的建议)使用ItemContainerGenerator的StatusChanged事件,但无济于事.事件永远不会发生.例如:
m_VariableList = getVariableList();
lstVariable_Selected.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
lstVariable_Selected.ItemsSource = m_VariableList;
...
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
//This code never gets called
var obj = lstVariable_Selected.ItemContainerGenerator.ContainerFromItem(m_VariableList[0]);
}
Run Code Online (Sandbox Code Playgroud)
这件事的关键在于我只想预先选择ListView中的一些项目.
为了不留下任何东西,ListView使用了一些模板和拖放功能,所以我在这里包含了XAML.本质上,此模板使每个项目成为带有一些文本的文本框 - 当选择任何项目时,将选中该复选框.并且每个项目下面都会有一个小字形以插入新项目(这一切都正常):
<DataTemplate x:Key="ItemDataTemplate_Variable">
<StackPanel>
<CheckBox x:Name="checkbox"
Content="{Binding Path=ListBoxDisplayName}"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
<Image ToolTip="Insert Custom Variable" Source="..\..\Resources\Arrow_Right.gif"
HorizontalAlignment="Left"
MouseLeftButtonDown="OnInsertCustomVariable"
Cursor="Hand" Margin="1, 0, 0, 2" Uid="{Binding Path=CmiOrder}" />
</StackPanel>
</DataTemplate> …
Run Code Online (Sandbox Code Playgroud) 我认为在WPF设置中应该是简单的双向数据绑定,但是当集合发生变化时,列表框(目标)不会更新.
我正在以编程方式设置ListBox的ItemsSource:
lstVariable_Selected.ItemsSource = m_VariableList;
Run Code Online (Sandbox Code Playgroud)
ListBox声明如下:
<ListBox Margin="5" Name="lstVariable_Selected">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Gray" BorderThickness="1" Margin="0">
<TextBlock FontSize="25" Text="{Binding Path=Name}" />
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
当我最初设置ItemsSource时,ListBox(当时不可见)获取其项目集.但是,如果我查看ListBox,那么更新似乎就此停止了.
然后我可以从m_VariableList集合中删除一个项目,它不会从ListBox中消失.同样,如果我添加一个,它就不会出现.
是什么赋予了?
我需要在我的数据库中识别包含电话号码的记录,以便我可以将它们发送给联系人团队.
示例:tblData
给定此表结构,查询可能是:
SELECT * FROM tblData WHERE comment [HeresWhereINeedHelp]
Run Code Online (Sandbox Code Playgroud)
评论可能(并且可能会)包含各种其他数据.一个示例评论:
是的,我有一个糟糕的经历.我希望有人在111.222.3333给我打电话.谢谢.
包含此评论的记录应在查询中提取,因为它包含电话号码.
我尝试了一个扩展的SPROC,它启用了正则表达式搜索,但性能非常糟糕.该系统是SQL Server 2012.
非常感谢任何方向.
.net ×3
c# ×3
wpf ×2
bindinglist ×1
data-binding ×1
listbox ×1
listview ×1
phone-number ×1
selecteditem ×1
sorting ×1
sql-server ×1
t-sql ×1
winforms ×1