J'essaie d'utiliser System.Windows.Forms.PropertyGrid
.Pourquoi l'attribut Browsable rend la propriété non collable?
Pour qu'une propriété ne soit pas visible dans cette grille, il faut utiliser BrowsableAttribute
défini sur false
. Mais l'ajout de cet attribut rend la propriété non collable.
Exemple: Créer un nouveau projet Windows Forms, et déposer une TextBox
et PropertyGrid
sur Form1
. En utilisant le code ci-dessous, la largeur de la TextBox
ne soit pas lié à 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;
}
}
Le code de la classe de données est:
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
}
Si vous changez l'attribut Browsable true sur chaque propriété dans Data cela fonctionne. Maintenant, il semble que BindingSource recherche une source de données par l'attribut Browsable.
Oui, vous avez raison. Cela semble fonctionner. J'ai ce problème dans un grand projet. Je vais essayer d'écrire un meilleur exemple bientôt. – bodziec