Próbuję użyć System.Windows.Forms.PropertyGrid
.Dlaczego atrybut Browsable sprawia, że właściwość nie jest powiązana?
Aby utworzyć właściwość niewidoczną w tej tabeli, należy użyć zestawu BrowsableAttribute
ustawionego na false
. Jednak dodanie tego atrybutu powoduje, że właściwość nie jest wiążąca.
Przykład: Utwórz nowy projekt Windows Forms i upuść TextBox
i PropertyGrid
na Form1
. Korzystanie poniższy kod, szerokość TextBox
nie zostanie zobowiązany do Data.Width
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Data data = new Data();
data.Text = "qwe";
data.Width = 500;
BindingSource bindingSource = new BindingSource();
bindingSource.Add(data);
textBox1.DataBindings.Add("Text", bindingSource, "Text", true,
DataSourceUpdateMode.OnPropertyChanged);
textBox1.DataBindings.Add("Width", bindingSource, "Width", true,
DataSourceUpdateMode.OnPropertyChanged);
propertyGrid1.SelectedObject = data;
}
}
Kod dla klasy danych jest:
public class Data : IBindableComponent
{
public event EventHandler TextChanged;
private string _Text;
[Browsable(true)]
public string Text
{
get
{
return _Text;
}
set
{
_Text = value;
if (TextChanged != null)
TextChanged(this, EventArgs.Empty);
}
}
public event EventHandler WidthChanged;
private int _Width;
[Browsable(false)]
public int Width
{
get
{
return _Width;
}
set
{
_Width = value;
if (WidthChanged != null)
WidthChanged(this, EventArgs.Empty);
}
}
#region IBindableComponent Members
private BindingContext _BindingContext;
public BindingContext BindingContext
{
get
{
if (_BindingContext == null)
_BindingContext = new BindingContext();
return _BindingContext;
}
set
{
_BindingContext = value;
}
}
private ControlBindingsCollection _DataBindings;
public ControlBindingsCollection DataBindings
{
get
{
if (_DataBindings == null)
_DataBindings = new ControlBindingsCollection(this);
return _DataBindings;
}
}
#endregion
#region IComponent Members
public event EventHandler Disposed;
public System.ComponentModel.ISite Site
{
get
{
return null;
}
set
{
}
}
#endregion
#region IDisposable Members
public void Dispose()
{
throw new NotImplementedException();
}
#endregion
}
Jeśli zmienisz atrybut Browsable true na każdej nieruchomości w Data działa. Teraz wygląda na to, że BindingSource przeszukuje źródła danych według Browsable Attribute.
Tak, masz rację. Wydaje się działać. Mam ten problem w dużym projekcie. Postaram się wkrótce napisać lepszy przykład. – bodziec