Tôi có một DataFrid WPF 4.0 được ràng buộc với một DataTable sử dụng AutoGenerateColumns = True. Các cột là năng động, tuy nhiên tôi biết sẽ luôn có một cột có tên là ID và tôi muốn ẩn cột này. Có cách nào tôi có thể làm điều này?Có cách nào để ẩn một cột cụ thể trong một DataGrid khi AutoGenerateColumns = True?
Trả lời
trong DataGrid của bạn, đăng ký cho sự kiện AutoGeneratingColumn
, sự kiện args
(DataGridAutoGeneratingColumnEventArgs
) có tên cột và một "Cancel
", nếu tên cột là ID sau đó thiết lập Cancel = true
. nên làm các trick.
Tôi không thể nói được 4, tuy nhiên không thể thực hiện được trong 3.5 SP1, ít nhất là không đăng ký sự kiện mà tôi muốn tránh bằng mọi giá.
gì bạn có thể làm thay vào đó là thay đổi mã thế hệ của bạn để AutoGenerateColumns=False
sau đó chỉ cần đặt các cột mà bạn quan tâm trong XAML như dữ liệu cơ bản tất cả sẽ vẫn được đặt trong các cột thích hợp
<dg:DataGridTextColumn Header="Display" Binding="{Binding DisplayName}"/>
<dg:DataGridTextColumn Header="Host" Binding="{Binding HostName}"/>
<dg:DataGridTextColumn Header="Database" Binding="{Binding Database}"/>
<dg:DataGridTextColumn Header="Username" Binding="{Binding Username}"/>
<dg:DataGridTextColumn Header="Password" Binding="{Binding Password}"/>
này sẽ cho phép bạn chỉ hiển thị các cột bạn quan tâm liên quan đến mô hình cơ bản cũng như thay đổi Header
để hiển thị như bạn thấy phù hợp, vì vậy bạn không bị ràng buộc với tên Property
trên mô hình.
tôi sẽ không nói đó là giải pháp tuyệt vời ... nhưng ... bạn có thể có thêm một trừu tượng lớp ví dụ giả sử bạn có một đối tượng như:
public class Foo
{
public string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
Bạn không muốn cột cho Id, do đó, bạn tạo đối tượng mới
public class Foo2
{
public string Property2 { get; set; }
public string Property3 { set; get; }
}
sau đó ánh xạ/chuyển đổi Foo thành Foo2 và bạn đã hoàn tất.
Một cách khác có thể (không phải lúc nào có thể) là thay đổi sửa đổi quyền truy cập vào nội
public class Foo
{
internal string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
cách này bạn sẽ không phải Id cột tạo ra một trong hai.
khả năng khác sẽ là Visibility.Collapsed
:
private void dataGrid_AutoGeneratingColumn(object sender,
DataGridAutoGeneratingColumnEventArgs e)
{
//Set properties on the columns during auto-generation
switch (e.Column.Header.ToString())
{
case "rownameYouWantToHide":
e.Column.Visibility = Visibility.Collapsed;
break;
}
}
Bạn có thể sử dụng một hành vi (mã tái sử dụng) để thực hiện công việc ... Bằng cách này bạn có thể sử dụng thuộc tính đó sẽ tập trung khả năng hiển thị cột ở một nơi.
Cách sử dụng:
<Window
...
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">
<DataGrid ...
extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">
...
public class YourObjectItem
{
[Browsable(false)]
public Assembly Assembly { get; set; }
Code:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace WpfControlLibrary.Extension
{
public static class DataGridBehavior
{
public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty =
DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn",
typeof(bool),
typeof(DataGridBehavior),
new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged));
public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj)
{
return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty);
}
public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val)
{
obj.SetValue(UseBrowsableAttributeOnColumnProperty, val);
}
private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var dataGrid = obj as DataGrid;
if (dataGrid != null)
{
if ((bool) e.NewValue)
{
dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn;
}
else
{
dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn;
}
}
}
private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var propDesc = e.PropertyDescriptor as PropertyDescriptor;
if (propDesc != null)
{
foreach(Attribute att in propDesc.Attributes)
{
var browsableAttribute = att as BrowsableAttribute;
if (browsableAttribute != null)
{
if (! browsableAttribute.Browsable)
{
e.Cancel = true;
}
}
}
}
}
}
}
Đây chính xác là những gì tôi đang tìm kiếm! Đã kiểm tra và làm việc trên .NET 4.6.1 :) – JoanComasFdz
Cảm ơn! Nó là tốt đẹp để biết rằng nó vẫn hoạt động tốt :)! –
DataGrid sẽ làm việc theo cách này ra khỏi hộp IMHO và nhận tiêu đề từ DisplayNameAttriibute quá! – StuartQ
- 1. Bất kỳ cách nào để thao tác các cột trong GridView với AutoGenerateColumns = true?
- 2. Định dạng dữ liệu trong GridView với AutoGenerateColumns true
- 3. Làm cách nào để xóa hoặc ẩn cột cụ thể trong một trường dữ liệu?
- 4. một cách trong c + + để ẩn một hàm cụ thể
- 5. Làm thế nào để ẩn tiêu đề cột trong một DataGrid WPF?
- 6. Làm thế nào tôi có thể xác định các cột của riêng mình trong một DataGrid WPF?
- 7. Làm cách nào để có thể tô sáng toàn bộ hàng DataGrid khi một ô được nhấp?
- 8. WPF DataGrid - Ẩn cột bằng cách sử dụng hộp kiểm
- 9. jqGrid: cách ẩn một trường tìm kiếm cụ thể trong thanh công cụ tìm kiếm
- 10. làm cách nào để chèn cột vào một chỉ mục cột cụ thể trong gấu trúc?
- 11. Trong WPF, làm thế nào tôi có thể ràng buộc cột dữ liệu vào một cột cụ thể của một datatable?
- 12. Ẩn một cột trong JTable
- 13. Thêm một sự kiện cuộn để DataGrid
- 14. Làm thế nào để chèn một cột trong một GridView sau khi tự động tạo ra các cột - ASP.NET
- 15. Lưới KENDOUI trong MVC: Có cách nào để ẩn bộ lọc trên một số cột không?
- 16. Có thể trong Rails3, để có một biểu mẫu nhiều => true & use remote => true
- 17. Tạo tiêu đề cột DataGrid có thể sắp xếp trong WPF bằng C#
- 18. Làm thế nào để ẩn một cột excel?
- 19. Ẩn một cột trong ASP.NET Dynamic Data
- 20. Làm cách nào để hợp nhất một tiêu đề cột cụ thể trong DataGridView C#?
- 21. áp dụng strsplit vào cột cụ thể trong một data.frame
- 22. Cách triển khai DataGridComboBoxColumn có thể chỉnh sửa trong WPF DataGrid
- 23. Làm cách nào để làm cho một cột có thể chỉnh sửa được trong dữ liệu chỉ đọc?
- 24. Qt - Làm cách nào để tôi có thể tạo một Cột QTableView cụ thể là Không thể Chỉnh sửa?
- 25. Cột được thu gọn khi sử dụng nhóm trong datagrid
- 26. Rails Migration để thực hiện một cột null => true
- 27. Làm thế nào tôi có thể nhận được một DataGrid để bỏ chọn khi click khi SelectionMode = "Extended"?
- 28. Làm cách nào để Ràng buộc các cột cụ thể của một dữ liệu có thể được datapridView?
- 29. Lấy Cột trong một Cột Cụ thể cho một hàng HBase
- 30. Làm cách nào để nhận NERDCommenter để thêm nhận xét vào một cột cụ thể?
Đó là công việc ...mặc dù nó ngay lập tức đi ngược lại mô hình MVVM ... nhưng chắc chắn sẽ không hoạt động. –
Cảm ơn bạn, điều đó sẽ hoạt động tốt. Tôi không quá quan tâm với MVVM trong trường hợp này kể từ khi DataGrid là một phần của một UserControl tùy chỉnh và tôi không có vấn đề bằng cách sử dụng code-behind nếu nó là cái gì đó chỉ ảnh hưởng đến View. – Rachel
@Aaron, nếu bạn đang dựa vào Chế độ xem để tạo MV, thì tôi nghĩ bạn sẽ thấy nó không tuân theo MVVM :) –