Có cách nào để tạo thuộc tính "Có thể duyệt" có điều kiện không, vì vậy thuộc tính áp dụng nó đôi khi sẽ xuất hiện trên trang thuộc tính và đôi khi không xuất hiện?
cảm ơn :)Thuộc tính "Có thể duyệt" có điều kiện
Trả lời
Không có cách nào dễ dàng.
Bạn có thể làm việc này bằng cách triển khai ICustomTypeDescriptor. Đây là một bài viết hay về implementing ICustomTypeDescriptor.
Hoặc bạn có thể liên kết ControlDesigner của riêng mình với lớp học của bạn và ghi đè phương thức PreFilterProperties để thêm hoặc xóa thuộc tính được xem trong lưới thuộc tính.
Bạn có thể thực hiện việc này bằng cách cung cấp mô hình kiểu tùy chỉnh; ở mức đơn giản nhất, bạn có thể cung cấp TypeDescriptor
tùy chỉnh cho loại của mình bắt nguồn từ ExpandableObjectConverter
và chỉ cần bao gồm/loại trừ thuộc tính đã cho lúc này - nhưng điều này chỉ hoạt động với PropertyGrid
- được sử dụng bởi trang thuộc tính. Một cách tiếp cận phức tạp hơn là sử dụng ICustomTypeDescriptor
/TypeDescriptionProvider
- điều này có thể hoạt động bên trong những thứ như DataGridView
tôi tình cờ này để tìm kiếm một cách để khai báo một số thành viên có thể nhìn thấy hoặc ẩn trong IntelliSense và có thể thay đổi nó một lần cho tất cả những gì cần thiết để được ẩn lúc biên dịch. Tôi không thể biết đó có phải là điều bạn đang tìm kiếm hay không, nhưng tôi đã tìm thấy câu trả lời cho câu hỏi của tôi ... tôi không thể chia sẻ.
tôi đặt một biểu tượng có điều kiện biên soạn (tìm thấy trong tab Build tài sản dự án) IS_VIS (giá trị là đúng nếu bạn muốn các thành viên nhất định để hiển thị, false nếu muốn bạn để ẩn chúng) và sau đó:
#if IS_VIS
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Always;
#else
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Never;
#endif
bạn sau đó tham chiếu biến isVis trong thuộc tính:
[EditorBrowsable(isVis)]
public string myMethod...
Tôi đã làm điều này trong VB và điều này đã nhanh chóng được chuyển thành C#. Nếu một cái gì đó không hoạt động đúng, hãy cho tôi biết.
Tôi không chắc chắn điều này áp dụng cho trường hợp của bạn, nhưng bạn có thể điều chỉnh trang trí "Có thể duyệt" trong thời gian chạy bằng cách gọi hàm bên dưới.
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
Xin chào. Tôi đang tìm một thứ như thế này. Khi tôi sử dụng mã của bạn, tôi nhận được một ngoại lệ nullValue trong dòng đầu tiên 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (this.GetType()) [strPropertyName];'.Tôi muốn biết nơi để đặt chức năng này và làm thế nào nó phản ánh trên lưới bất động sản (không nhìn thấy một đối tượng propertyGrid trong chức năng). –
Cảm ơn bạn rất nhiều vì giải pháp của bạn, tôi đã thay đổi dòng thành 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (vObject.GetType()) [strPropertyName];', trong đó vObject là đối tượng tôi đang thay đổi. –
Như một sự cải tiến về câu trả lời @ neoikon của trên và để tránh sự ngoại lệ Ganesh đề cập trong các ý kiến, đây là một phiên bản sử dụng Generics để có được các loại:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
Sau đó, bạn cũng có thể thêm một phiên bản mà phải mất một ví dụ:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="obj">An instance of the object whose property should be modified.</param>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable)
{
SetBrowsableProperty<T>(strPropertyName, bIsBrowsable);
}
Cách sử dụng:
class Foo
{
[Browsable(false)]
public string Bar { get; set; }
}
void Example()
{
SetBrowsableProperty<Foo>("Bar", true);
Foo foo = new Foo();
SetBrowsableProperty(foo, "Bar", false);
}
- 1. C#! Thuộc tính có điều kiện?
- 2. Handlebars thuộc tính lớp có điều kiện
- 3. Thuộc tính có điều kiện trên hàm ảo
- 4. d3 thêm thuộc tính dữ liệu có điều kiện
- 5. Một chuỗi các phần tử XML có thể có điều kiện trên một thuộc tính không?
- 6. có điều kiện bao gồm thuộc tính trong XML đen
- 7. Tại sao thuộc tính Có thể duyệt web làm cho thuộc tính không bị ràng buộc?
- 8. Bạn có thể đặt hai điều kiện vào thuộc tính thử nghiệm xslt không?
- 9. Có thể sử dụng toán tử điều kiện EL trong thuộc tính action không?
- 10. Phụ thuộc đá quý có điều kiện
- 11. maven phụ thuộc có điều kiện
- 12. Làm cách nào để Javascript của bạn có điều kiện, tùy thuộc vào trình duyệt?
- 13. Có thể Require.js tải tập lệnh có điều kiện không?
- 14. Tôi có thể đặt thuộc tính `thuộc tính` của` UILabel`
- 15. Các thuộc tính đầu vào có thể có cùng tên "
- 16. Thuộc tính XML có thể có dấu cách không?
- 17. Cách đặt điểm ngắt có điều kiện trong Xcode dựa trên thuộc tính chuỗi đối tượng?
- 18. Html.TextBox thuộc tính có điều kiện với ASP.NET MVC Preview 5
- 19. Knockout.js: có điều kiện ràng buộc thuộc tính tiêu đề của div
- 20. Tạo thuộc tính có thể ném IndexOutOfRangeException
- 21. có điều kiện làm cho thuộc tính nguyên tố trong một thành phần hỗn
- 22. Lâu đài windor Thêm phụ thuộc có điều kiện
- 23. Làm cách nào để thêm điều kiện thuộc tính id vào TAL (PHPTAL) theo điều kiện?
- 24. "Điều kiện có điều kiện" trong mệnh đề WHERE (Điều kiện áp dụng nào phụ thuộc vào cờ "chế độ")
- 25. Phụ thuộc có điều kiện trong Ruby Gemspec
- 26. Thuộc tính ràng buộc điều kiện không hoạt động?
- 27. Tôi có thể có thuộc tính [] chung này không?
- 28. SP_WHO2 có điều kiện?
- 29. Có thể có thuộc tính IEnumerable <T> không?
- 30. Thuộc tính nhãn aria có thể có giá trị nào?
liên kết để triển khai ICustomTypeDescriptor.got được chỉ tới https://msdn.microsoft.com/magazine/msdn-magazine-issues Tôi nghĩ rằng họ đã xóa trang gốc – gg89