2012-10-20 5 views
0

Je veux mettre en œuvre un FileNameEditor personnalisé; Je veux définir mon propre filtre et je veux être en mesure de sélectionner plusieurs fichiers.sur mesure FileNameEditor

public class Settings 
{ 
    [EditorAttribute(typeof(FileNamesEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    public string FileNames { get; set; } 
} 

public class FileNamesEditor : FileNameEditor 
{ 
    protected override void InitializeDialog(OpenFileDialog openFileDialog) 
    { 
     openFileDialog.Multiselect = true; 
     openFileDialog.Filter = "Word|*.docx|All|*.*"; 
     base.InitializeDialog(openFileDialog); 

    } 
} 

Cela ne tient pas la propriété de filtre et bien que je suis en mesure de sélectionner plusieurs fichiers, je ne peux pas les attribuer à ma propriété, car Settings.FileNames Settings.FileNames est de type string [] et le résultat de la classe dérivée est une chaîne. Comment puis-je dire à ma classe dérivée de retourner les noms de fichiers de OpenFileDialog et comment faire fonctionner le filtre? Qu'est-ce que je rate?

+0

Je ne comprends pas vraiment votre question, la boîte de dialogue a une propriété appelée FileNames que vous pouvez faire foreach over. Je ne suis pas non plus dans la classe Settings. Qu'est-ce qui doit être dans la propriété FileNames? Voulez-vous les fichiers séparés par des virgules? – rfcdejong

+0

La classe paramètres organisera plusieurs paramètres tels que les fichiers d'entrée pour calculer, chemins d'accès aux assemblées d'aide, options de format de sortie, les paramètres de la mondialisation et d'autres ... il est sérialisée lors de l'enregistrement des paramètres et chargés à chaque démarrage de programm pour enregistrer l'utilisateur de sélectionner ceux-ci à chaque démarrage de l'application. Les fichiers d'entrée doivent être choosable au moyen d'un OpenFileDialog ... les paramètres sont une classe générique indiqué dans PropertyGrid. – Llarian

Répondre

0

peut-être utiliser un ArrayEditor pour la chaîne []

public class Settings 
{ 
    [EditorAttribute(typeof(System.ComponentModel.Design.ArrayEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    public string[] FileNames { get ; set; } 
} 
+0

Je veux utiliser le FileNameEditor comme UITypeEditor, mais ont besoin d'appliquer mes paramètres à elle. – Llarian

+0

jeter un oeil à http://winterdom.com/2006/08/acustomuitypeeditorforactivityproperties – rfcdejong

0

D'accord, voici comment cela fonctionne ...

public class FileNamesEditor : UITypeEditor 
{ 
    private OpenFileDialog ofd; 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     if ((context != null) && (provider != null)) 
     { 
      IWindowsFormsEditorService editorService = 
      (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
      if (editorService != null) 
      { 
       ofd = new OpenFileDialog(); 
       ofd.Multiselect = true; 
       ofd.Filter = "Word|*.docx|All|*.*"; 
       ofd.FileName = ""; 
       if (ofd.ShowDialog() == DialogResult.OK) 
       { 
        return ofd.FileNames; 
       } 
      } 
     } 
     return base.EditValue(context, provider, value); 
    } 
} 
+0

la bonne réponse, et l'utiliser avec [Editor (typeof (FileNamesEditor), typeof (UITypeEditor))] – rfcdejong

3

Le code original a fonctionné pour moi, à l'exception d'un re nécessaire commander. Vous devez appeler le base.Initialize avant vos modifications, ou ils seront écrasés (le débogage montrera gentiment)

public class FileNamesEditor : FileNameEditor 
{ 
    protected override void InitializeDialog(OpenFileDialog openFileDialog) 
    { 
     base.InitializeDialog(openFileDialog); 
     openFileDialog.Multiselect = true; 
     openFileDialog.Filter = "Word|*.docx|All|*.*"; 
    } 
}