小编Pau*_*ett的帖子

BindingList <T> .Sort()表现得像List <T> .Sort()

我正在尝试编写一个可用于我的应用程序的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)

.net c# sorting bindinglist winforms

21
推荐指数
2
解决办法
3万
查看次数

在WPF ListView中以编程方式选择项目

我无法弄清楚如何在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)

.net c# wpf listview selecteditem

20
推荐指数
2
解决办法
5万
查看次数

WPF ListBox没有使用ItemsSource更新

我认为在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中消失.同样,如果我添加一个,它就不会出现.

是什么赋予了?

.net c# data-binding wpf listbox

9
推荐指数
3
解决办法
2万
查看次数

如何识别包含电话号码的记录

我需要在我的数据库中识别包含电话号码的记录,以便我可以将它们发送给联系人团队.

示例:tblData

  • ID
  • 评论
  • dtCreate

给定此表结构,查询可能是:

SELECT * FROM tblData WHERE comment [HeresWhereINeedHelp]
Run Code Online (Sandbox Code Playgroud)

评论可能(并且可能会)包含各种其他数据.一个示例评论:

是的,我有一个糟糕的经历.我希望有人在111.222.3333给我打电话.谢谢.

包含此评论的记录应在查询中提取,因为它包含电话号码.

我尝试了一个扩展的SPROC,它启用了正则表达式搜索,但性能非常糟糕.该系统是SQL Server 2012.

非常感谢任何方向.

t-sql sql-server phone-number

1
推荐指数
1
解决办法
806
查看次数