2010-03-30 2 views
14

मैं WinForms प्रोजेक्ट के लिए एक हल्के एमवीपी पैटर्न को एक साथ रख रहा हूं। सब कुछ संकलित और ठीक चलाता है। हालांकि जब मैं विजुअल स्टूडियो में डिज़ाइन मोड में WinForm खोलने का प्रयास करता हूं तो मुझे "पथ पथ में अवैध वर्ण" त्रुटि मिलती है। मेरा विनफॉर्म जेनिक्स का उपयोग कर रहा है और बेस फॉर्म क्लास से विरासत में है। WinForm में जेनेरिक का उपयोग करने में कोई समस्या है?"पथ में अवैध पात्र।" विजुअल स्टूडियो विनफॉर्म डिज़ाइन व्यू

यहां WinForm और बेस फॉर्म क्लास है।

public partial class TapsForm : MvpForm<TapsPresenter, TapsFormModel>, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     :base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 

बेस रूप MvpForm:

public class MvpForm<TPresenter, TModel> : Form, IView 
    where TPresenter : class, IPresenter 
    where TModel : class, new() 
{ 
    private readonly TPresenter presenter; 
    private TModel model; 

    public MvpForm() 
    { 
    } 

    public MvpForm(TPresenter presenter) 
    { 
     this.presenter = presenter; 
     this.presenter.RegisterView(this); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (presenter != null) 
      presenter.IntializeView(); 
    } 

    public TModel Model 
    { 
     get 
     { 
      if (model == null) 
       throw new InvalidOperationException("The Model property is currently null, however it should have been automatically initialized by the presenter. This most likely indicates that no presenter was bound to the control. Check your presenter bindings."); 

      return model; 
     } 
     set { model = value;} 
    } 
} 
+1

हां, डिजाइनर जेनेरिक आधार रूपों का समर्थन नहीं करता है। शायद आपको यह दूर नहीं मिला है, मुझे लगता है कि यह अपवाद पर मर रहा है क्योंकि आप डिजाइनरोड (कन्स्ट्रक्टर, लोड इवेंट) में चलने वाले कोड में DesignMode प्रॉपर्टी की जांच नहीं करते हैं। –

उत्तर

12

This post helped answer my question.

जाहिर है, यह एक दृश्य स्टूडियो में सीमा। मैं जेनेरिक मूल्यों को परिभाषित करने वाली मध्यस्थ वर्ग रखने के द्वारा इसके आसपास काम करने में सक्षम था। यह वास्तव में बदसूरत काम के आसपास काम करता है, लेकिन अब मैं विजुअल स्टूडियो में फॉर्म खोल सकता हूं।

यहां मेरी मध्यस्थ वर्ग है, जो या तो एक अलग फ़ाइल में होनी चाहिए, या फॉर्म क्लास परिभाषा के बाद।

public class MvpTapsForm : MvpForm<TapsPresenter, TapsFormModel> 
{ 
} 

तब मेरे वास्तविक रूप में मैं MvpTapsForm से विरासत: यह भी एक डिफ़ॉल्ट निर्माता, अस्पष्ट या स्पष्ट होना आवश्यक है।

public partial class TapsForm : MvpTapsForm, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     : base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 
+0

मुझे लगता है कि यह वीएस 2015 अपडेट में तय है 1. अद्यतन स्थापित करने के बाद यहां ठीक काम करता है। – Jerther

+0

आह इसे भूल जाओ, कभी-कभी यह तब भी काम नहीं करेगा जब जेनेरिक कुछ कस्टम क्लैस को परिभाषित किया गया हो। – Jerther