Comment le contrôle de forme d'accès à l'intérieur de la méthode ToString struct imbriqué

StackOverflow https://stackoverflow.com/questions/4317813

  •  29-09-2019
  •  | 
  •  

Question

Je construis une petite application Windows forme en C #. Dans le code de formulaire I définir une structure publique avec une méthode ToString qui doit construire une partie de sa production à partir d'éléments en ComboBoxes sur le même formulaire. Cela ne semble pas comme il devrait être difficile

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}

Il se plaint qu'il ne peut pas trouver une définition pour sizeComboBox. Si j'utilise explicitement le nom de la forme, il dit une référence d'objet est nécessaire pour le champ statique ... Je ne suis pas tout à fait sûr de ce qu'il veut dire par là. L'utilisation this.sizeComboBox fait référence à la struct, et non la forme. En utilisant simplement sizeComboBox, encore une fois, il faut une référence d'objet.

Était-ce utile?

La solution

Le struct connaît son type classe contenant , mais il ne sait pas un cas particulier de ce type, à moins que vous le dites. Par exemple, vous pouvez créer un constructeur qui prend un objet Form1, et il peut enregistrer une référence à cette forme dans une variable membre.

public partial class Form1 : Form 
{ 
 public struct OrderLineItem 
    { 
     string someString; 
     int index; 
     Form1 parentForm;

     internal OrderLineItem(Form1 parentForm)
     {
         this = new OrderLineItem();
         this.parentForm = parentForm;
     }

     string ToString() 
     {
         if (parentForm == null)
             return string.Empty;
         else
             return someString + parentForm.sizeComboBox.Items[index].ToString();
     }   
    } 
} 

Cela dit, c'est un design très au sérieux discutable.

La structure à plusieurs niveaux de cette application semble être à l'envers. Les objets de commande line-élément doit exister à un niveau inférieur à la couche d'interface utilisateur. L'interface utilisateur peut parfois voir les objets métier (ordre, ordre, par poste, etc.), mais les objets d'affaires ne devrait pas savoir quoi que ce soit sur l'interface utilisateur.

Si vous pouvez inverser cette structure, il fera le code beaucoup plus propre.

Autres conseils

Supposons que l'autre forme est Form2 vous pouvez lancer ActiveForm à Form2:

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}

Edit: Deux notes.

  1. Au lieu d'obtenir ActiveForm il est préférable Dialogue2 stocker dans une variable membre dans form1 lorsque form2 est créé.
  2. Vous devriez obtenir l'encapsuler des valeurs combobox derrière une propriété Form2, comme SelectedFooValue.
    public partial class Form1 : Form
{
    internal static Form1 ActiveForm { get; set; }

    public Form1()
    {
        InitializeComponent();
        ActiveForm = this;
    }

    public struct OrderLineItem
    {
        public override string ToString()
        {
            return ActiveForm.sizeComboBox.Items[index].ToString();
        }
    }

A noter toutefois que ce n'est pas la bonne approche. Peut-être vous pouvez poster ce que vous essayez d'accomplir et nous pouvons vous aider?

Vous devez convertir ActiveForm à Form1.

Quelque chose comme ça, je pense que (ne pas ouvrir VS maintenant vérifier):

return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();

Cependant, ce qui est généralement pas une bonne façon de faire les choses, vous ne devriez pas faire vos méthodes dans vos classes et structs consulter le répertoire des contrôles depuis lors, vous les attacher ensemble à près. Essayez d'envoyer les données au lieu struct ou créer une méthode sur le formulaire pour renvoyer les données d'une certaine façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top