C# Affectation de propriété par défaut pour la classe et l'opérateur =
Problème 1:
J'ai une simple application winforms et je veux DataBind ma Personne.Nom de la propriété à une zone de texte. Le nom est de type StringField. J'ai d'abord défini le Nom de la propriété en tant que Chaîne de caractères. La liaison de données fonctionne très bien sur les types de valeur tels que Chaîne de caractères. Je voudrais que le StringField.La valeur de la propriété à la propriété par défaut de StringField. Je veux voir la valeur de StringField.Valeur dans la zone de texte plutôt que le texte "FieldApp.StringField".
Problème 2:
Je voudrais être en mesure d'assigner une chaîne à une StringField l'aide de l'opérateur =. Cette mission aurait pour résultat la StringField.La valeur de membre en cours de jeu.
Cela peut-il être réalisé?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FieldApp
{
public class StringField
{
public string Value { get; set; }
}
public class Person
{
//private String _Name;
//public String Name
//{
// get { return _Name; }
// set { _Name = value; }
//}
//public Person(string name)
//{
// Name = name;
//}
private StringField _Name;
public StringField Name
{
get { return _Name; }
set { _Name = value; }
}
public Person(string name)
{
Name = new StringField();
Name.Value = name;
}
}
public partial class FieldAppForm : Form
{
Person person = new Person("steve");
public FieldAppForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//our form contains a button1 and textBox1
//this compiles
person.Name.Value = "steve";
//this does not. Is there anyway to accomplish this?
person.Name = "steve";
//steve appears in the textbox
textBox1.DataBindings.Add("Text", person, "Name.Value");
//FieldApp.StringField appears in the textbox
textBox1.DataBindings.Add("Text", person, "Name");
}
}
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une implisit opérateur de surcharge. Ensuite, vous pouvez créer Stringfield de chaînes comme ceci:
Sais que cela crée une nouvelle StringField objet. Je n'aurais pas nécessairement des conseils pour ce faire.
Re de liaison de données, pour certains des objectifs contraignants (
PropertyGrid
,DataGridView
, etc), vous pouvez le faire avec unTypeConverter
(voir ci-dessous). Malheureusement, cela ne semble pas fonctionner avecTextBox
, donc je pense que votre meilleure option est de simplement ajouter une cale de propriété (comme l'a déjà suggéré):(et de les lier à des
NameString
)Dans le passé, j'ai utilisé personnalisé
PropertyDescriptor
implémentations à côté de cette étape, mais elle n'est pas la peine juste pour cela.De toute façon, un
TypeConverter
exemple (fonctionne avecPropertyGrid
etDataGridView
):Vous pouvez mettre en œuvre la cession par la fourniture d'un opérateur de conversion. Compte tenu de la nature de votre classe, vous devriez également de remplacer les méthodes de l'Objet:
Vous pouvez haidara la StringField par la cartographie de la propriété Name pour le Nom.Champ de valeur en interne dans votre classe.
de sorte que vous pouvez définir le Nom de la propriété comme ceci:
Ici _name est votre StringField variable.
De l'opérateur d'affectation ne peut pas être remplacée en C#. Vous pouvez, toutefois, ont la propriété de faire la conversion de type pour vous exposer et qu'on les classe