csv 通过在文本框中输入单词在DataGrid中进行搜索

pxiryf3j  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(108)

我在WPF中创建了一个Datagrid,有8列和190行,它从csv文件加载数据。现在我已经创建了一个TextBox,我在其中写了一个单词,它必须在DataGrid中搜索它,并显示在同一个DataGrid1中找到的所有单词。我创建的代码在MainWindow.xaml中显示了一个错误。
这就是错误:
CS1061“type”不包含“name”的定义,并且找不到接受类型“type”的第一个参数的可访问扩展方法“name”(是否缺少using指令或程序集引用?).
注意:错误消息来自MSDN documentation,可能不会反映正确的消息,例如。“type”可以是实际类型而不是此通配符
下面是MainWindow.xaml代码:

<TextBox x:Name="TextBox_Cerca" 
    HorizontalAlignment="Left" 
    Margin="84,49,0,0" 
    TextWrapping="Wrap" 
    VerticalAlignment="Top" 
    Width="128" 
    RenderTransformOrigin="-0.775,-0.722" 
    Height="22" 
    TextChanged="TexttBox_Cerca_TextChanged" 
    KeyUp="FilterTextBox_CercaChanged" />

代码c#:

private void TexttBox_Cerca_TextChanged(object sender, TextChangedEventArgs e)
{
    var filterTextBox = (TextBox)sender;
    var filterText = filterTextBox.Text;

    SetRowVisibilityByFilterText(filterText);
}

private void SetRowVisibilityByFilterText(string filterText)
{
    GetVisibleRows(DataGrid1)
        .ToList()
        .ForEach(
            x =>
            {
                if (x == null) return;
                x.Visibility =
                    DataMatchesFilterText(x.Item as OttoColonne, filterText) ? Visibility.Visible : Visibility.Collapsed;
    });
}

private bool DataMatchesFilterText(OttoColonne? ottoColonne, string filterText)
{
    throw new NotImplementedException();
}    

public static IEnumerable<DataGridRow> GetVisibleRows(DataGrid grid)
{
    if (grid == null || grid.Items == null) yield break;
    int count = grid.ItemsSource == null
        ? grid.Items.Count
        : grid.ItemsSource.Cast<object>().Count();

    for (int i = 0; i < count; i++)
    {
        yield return (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
    }
}

class OttoColonne
{
    public int ID { get; set; }
    public string Squadra_casa { get; set; }
    public string Squadra_fuoric { get; set; }
    public string Ris_cas { get; set; }
    public string Ris_fuorc { get; set; }
    public string segni { get; set; }
    public string Data { get; set; }
    public string Giornate { get; set; }
}
6xfqseft

6xfqseft1#

在WPF中,您总是通过筛选集合视图来筛选数据集合。这产生了简单而高性能的代码。例如,专注于数据消除了处理容器虚拟化的需要。
下面的示例通过将筛选器委托分配给ICollectionView.Filter属性来隐藏与筛选器 predicate 不匹配的行。
集合的默认集合视图是通过使用静态helper方法CollectionViewSource.GetDefaultView获得的:

用户.cs

// Example data item to populate a two column DataGrid
class User : INotifyPropertyChanged
{
  public string Username { get; set; }
  public int UserId { get; set; }
}

MainWindow.xaml.cs

partial class MainWindow : Window
{
  private ObservableCollection<DataGridItem> Users { get; }

  public MainWindow()
  {
    InitializeComponent();
 
    this.Users = new ObservableCollection<DataGridItem>() 
    { 
      // TODO::Initialize collection with User items 
    };
    this.UsersDataGrid.ItemsSource = this.Users;
  }

  private void OnFilterButtonClicked(object sender, RoutedEventArgs e)
  {
    string usernamePredicate = this.FilterPredicateTextBox.Text;
    ICollectionView usersView = CollectionViewSource.GetDefaultView(this.Users);

    // Only display the users 
    // where the Username value matches the usernamePredicate value
    usersView.Filter = item => (item as User).Username.Equals(usernamePredicate, StringComparison.InvariantCultureIgnoreCase);
  }
}

MainWindow.xaml

<Window>
  <StackPanel>
    <TextBox x:Name="FilterPredicateTextBox" />
    <Button Content="Execute DataGrid Filter" 
            Click="OnFilterButtonClicked" />
    <DataGrid x:Name="UsersDataGrid" />
  </StackPanel>
</Window>

相关问题