আমি কীভাবে ভিজুয়াল স্টুডিও ২০০৮ উইন্ডোজ ফর্ম ডিজাইনারকে এমন একটি ফর্ম রেন্ডার করতে পারি যা একটি বিমূর্ত বেস শ্রেণি প্রয়োগ করে?


98

আমি উইন্ডোজ ফর্মগুলিতে উত্তরাধিকার সূত্রে প্রাপ্ত নিয়ন্ত্রণগুলির সাথে একটি সমস্যা জড়িত করেছি এবং এ সম্পর্কে কিছু পরামর্শ প্রয়োজন need

আমি একটি তালিকার আইটেমগুলির জন্য একটি বেস ক্লাস ব্যবহার করি (প্যানেল দিয়ে তৈরি স্বনির্মিত জিইউআই তালিকা) এবং কিছু উত্তরাধিকার সূত্রে নিয়ন্ত্রণ যা তালিকায় যোগ করা যেতে পারে এমন প্রতিটি ধরণের ডেটার জন্য।

এটি নিয়ে কোনও সমস্যা ছিল না, তবে আমি এখন জানতে পেরেছি যে বেস-কন্ট্রোলটিকে একটি বিমূর্ত শ্রেণি তৈরি করা ঠিক হবে, যেহেতু এর পদ্ধতি রয়েছে, যা সমস্ত উত্তরাধিকারসূত্রে নিয়ন্ত্রণে প্রয়োগ করা দরকার, যা কোডের ভিতরে থেকে ডাকা হয় বেস-কন্ট্রোল, তবে অবশ্যই বেস ক্লাসে প্রয়োগ করা যায় না এবং করা যায় না।

আমি যখন বেস-নিয়ন্ত্রণটিকে বিমূর্ত হিসাবে চিহ্নিত করি তখন ভিজ্যুয়াল স্টুডিও 2008 ডিজাইনার উইন্ডোটি লোড করতে অস্বীকার করে।

বেস-কন্ট্রোল অ্যাবস্ট্র্যাক্ট দিয়ে ডিজাইনারের কাজ পাওয়ার কী উপায় আছে?

উত্তর:


97

আমি জানতাম সেখানে এটি করার একটি উপায় থাকতে হবে (এবং আমি এটি পরিষ্কারভাবে করার একটি উপায় খুঁজে পেয়েছি)। শেংয়ের সমাধানটি হ'ল আমি অস্থায়ী Formকর্মক্ষেত্র হিসাবে হাজির হলাম তবে বন্ধুটি ইঙ্গিত করার পরে যে ক্লাসটি শেষ পর্যন্ত ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে abstract, আমরা এটি করতে সক্ষম হব। তারা যদি এটি করতে পারে তবে আমরা এটি করতে পারি।

আমরা এই কোডটি থেকে সমস্যায় গিয়েছিলাম

Form1 : Form

সমস্যা

public class Form1 : BaseForm
...
public abstract class BaseForm : Form

এখানেই প্রাথমিক প্রশ্নটি কার্যকর হয়েছিল। যেমন আগেই বলা হয়েছিল, এক বন্ধু নির্দেশ করেছিল যে System.Windows.Forms.Formএকটি বেস ক্লাস প্রয়োগ করে যা বিমূর্ত আমরা সন্ধান করতে সক্ষম ছিলাম ...

একটি ভাল সমাধান প্রমাণ

এ থেকে আমরা জানতাম যে ডিজাইনারের পক্ষে এমন একটি ক্লাস দেখানো সম্ভব হয়েছিল যা একটি বেস বিমূর্ত শ্রেণি প্রয়োগ করে, এটি কেবল এমন ডিজাইনার শ্রেণিটি প্রদর্শন করতে পারেনি যা অবিলম্বে একটি বেস বিমূর্ত শ্রেণি প্রয়োগ করে। অন্তত ৫০ টি অন্তঃসত্ত্বা থাকতে হয়েছিল, তবে আমরা বিমূর্ততার 1 স্তর পরীক্ষা করেছি এবং প্রাথমিকভাবে এই সমাধানটি নিয়ে এসেছি।

প্রাথমিক সমাধান

public class Form1 : MiddleClass
...
public class MiddleClass : BaseForm
... 
public abstract class BaseForm : Form
... 

এটি আসলে কাজ করে এবং ডিজাইনার এটি সূক্ষ্ম করে তোলে, সমস্যা সমাধান হয়েছে .... আপনার উত্পাদন অ্যাপ্লিকেশনটিতে আপনার অতিরিক্ত স্তরের উত্তরাধিকার নেই যা উইন্টারফর্ম ডিজাইনারের অপ্রতুলতার কারণে কেবল প্রয়োজনীয় ছিল!

এটি 100% শিফায়ার সমাধান নয় তবে এটি বেশ ভাল। মূলত আপনি #if DEBUGপরিশোধিত সমাধানের সাথে আসতে ব্যবহার করেন।

পরিশোধিত সমাধান

Form1.cs

#if DEBUG
public class Form1 : MiddleClass
#else 
public class Form1 : BaseForm
#endif
...

মিডলক্লাস। সি

public class MiddleClass : BaseForm
... 

বেসফর্ম.সি

public abstract class BaseForm : Form
... 

এটি যা করে কেবলমাত্র "প্রাথমিক সমাধান" তে বর্ণিত সমাধানটি ব্যবহার করা, যদি এটি ডিবাগ মোডে থাকে। ধারণাটি হ'ল আপনি কখনই ডিবাগ বিল্ডের মাধ্যমে উত্পাদন মোড প্রকাশ করবেন না এবং আপনি সর্বদা ডিবাগ মোডে ডিজাইন করবেন।

ডিজাইনার সর্বদা বর্তমান মোডে নির্মিত কোডের বিরুদ্ধে চলবে, তাই আপনি মুক্তির মোডে ডিজাইনার ব্যবহার করতে পারবেন না। যাইহোক, আপনি যতক্ষণ না ডিবাগ মোডে ডিজাইন করেন এবং রিলিজ মোডে নির্মিত কোডটি প্রকাশ করেন ততক্ষণ আপনি ভাল।

আপনি যদি প্রিপ্রোসেসর নির্দেশিকার মাধ্যমে ডিজাইন মোডের জন্য পরীক্ষা করতে পারেন তবে একমাত্র নিশ্চিত অগ্নি সমাধান।


4
আপনার ফর্ম এবং বিমূর্ত বেস বর্গ একটি নন-আরগ নির্মাণকারী আছে? একটি বিমূর্ত ফর্ম থেকে উত্তরাধিকারসূত্রে প্রাপ্ত ফর্মটি দেখানোর জন্য ডিজাইনারকে কাজ করার জন্য আমাদের যুক্ত করতে হবে তার কারণটি।
টি

দুর্দান্ত কাজ করেছেন! আমি অনুমান করি যে আমি বিমূর্তটি প্রয়োগকারী বিভিন্ন শ্রেণীর জন্য আমার প্রয়োজনীয় পরিবর্তনগুলি করব, তারপরে আবার অস্থায়ী মধ্যবিত্তকে সরিয়ে ফেলব এবং পরে যদি আমাকে আরও পরিবর্তন করার প্রয়োজন হয় তবে আমি এটিকে আবার যুক্ত করতে পারি। কর্মক্ষেত্রটি সত্যই কাজ করেছিল। ধন্যবাদ!
নিমিনেম

4
আপনার সমাধান দুর্দান্ত কাজ করে। আমি কেবল বিশ্বাস করতে পারি না ভিজ্যুয়াল স্টুডিওর এত সাধারণ কিছু করার জন্য আপনাকে এই ধরনের হুপগুলির মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে।
আরবি ডেভিডসন

4
তবে আমি যদি মিডল ক্লাস ব্যবহার করি যা বিমূর্ত শ্রেণি নয়, তবে মিডলক্লাসের উত্তরাধিকার সূত্রে প্রাপ্ত ব্যক্তিকে আর বিমূর্ত পদ্ধতি প্রয়োগ করতে হবে না, এটি প্রথমে অ্যাবস্ট্রাক্ট শ্রেণির ব্যবহারের উদ্দেশ্যকে পরাস্ত করে ... কীভাবে এটি সমাধান করা যায়?
দারিয়াস

4
@ ti034 আমি কোনও কাজ খুঁজে পাইনি। সুতরাং আমি মিডল ক্লাস থেকে অনুমিত বিমূর্ত ফাংশনগুলির কিছু ডিফল্ট মান রয়েছে যা সহজেই আমাকে এটিকে ওভাররাইড করতে স্মরণ করিয়ে দিতে পারে, ত্রুটি ছুঁড়ে ফেলার সংকলক ছাড়াই। উদাহরণস্বরূপ, যদি অনুমিত বিমূর্ত পদ্ধতিটি পৃষ্ঠার শিরোনাম ফিরিয়ে আনতে হয় তবে আমি এটিকে "দয়া করে শিরোনাম পরিবর্তন করুন" একটি স্ট্রিং ফিরিয়ে আনব।
দারিয়াস

74

@ সিমল্চ, ডিবাগের জন্য এমনকি একটি মাঝারি নিয়ন্ত্রণ তৈরি না করেই আরও ভাল সমাধান রয়েছে।

আমরা কি চাই

প্রথমে চূড়ান্ত শ্রেণি এবং বেস বিমূর্ত শ্রেণীর সংজ্ঞা দেওয়া যাক।

public class MyControl : AbstractControl
...
public abstract class AbstractControl : UserControl // Also works for Form
...

এখন আমাদের কেবল একটি বিবরণ সরবরাহকারীর প্রয়োজন

public class AbstractControlDescriptionProvider<TAbstract, TBase> : TypeDescriptionProvider
{
    public AbstractControlDescriptionProvider()
        : base(TypeDescriptor.GetProvider(typeof(TAbstract)))
    {
    }

    public override Type GetReflectionType(Type objectType, object instance)
    {
        if (objectType == typeof(TAbstract))
            return typeof(TBase);

        return base.GetReflectionType(objectType, instance);
    }

    public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
    {
        if (objectType == typeof(TAbstract))
            objectType = typeof(TBase);

        return base.CreateInstance(provider, objectType, argTypes, args);
    }
}

অবশেষে আমরা কেবল অ্যাবস্ট্রাক্ট কন্ট্রোলের জন্য একটি টাইপডেস্ক্রিপশনপ্রাইডার অ্যাট্রিবিউট প্রয়োগ করি।

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<AbstractControl, UserControl>))]
public abstract class AbstractControl : UserControl
...

এবং এটাই. কোন মাঝারি নিয়ন্ত্রণ প্রয়োজন।

এবং সরবরাহকারী বর্গটি একই সমাধানে আমরা যতগুলি অ্যাবস্ট্রাক্ট বেসগুলিতে চাই প্রয়োগ করতে পারি।

* সম্পাদনা করুন * এছাড়াও অ্যাপকনফাইগ এ নিম্নলিখিতগুলির প্রয়োজন

<appSettings>
    <add key="EnableOptimizedDesignerReloading" value="false" />
</appSettings>

পরামর্শের জন্য @ ব্যবহারকারী 3057544 ধন্যবাদ।



4
এটি আমার পক্ষে এটিও কাজ করেছিল যে আমি সিএফ 3.5 ব্যবহার করছি সেখানে কোনও নেইTypeDescriptionProvider
অ্যাড্রিয়ান বোটার

4
এটি ভিএস ২০১০ এ কাজ করতে পারা যায় নি, যদিও গন্ধযুক্তরা কাজ করেছে। কেউ জানেন কেন?
রবসি

5
@ রবসি ডিজাইনার কোনও কারণে ক্ষুধার্ত। আমি দেখতে পেয়েছি যে এই সংশোধনটি কার্যকর করার পরে আমাকে সমাধানটি পরিষ্কার করতে হবে, ভিএস 2010 বন্ধ ও পুনরায় চালু করতে হবে এবং পুনর্নির্মাণ করতে হবে; তাহলে এটি আমাকে সাবক্লাসটি ডিজাইন করতে দেবে।
.ষি

4
এটি লক্ষণীয় যে এই বিধানটি বিমূর্ত শ্রেণীর জন্য বেস বর্গের একটি উদাহরণকে প্রতিস্থাপন করে, বিমূর্ত শ্রেণীর জন্য ডিজাইনারে যুক্ত ভিজ্যুয়াল উপাদানগুলি সাবক্লাসগুলি ডিজাইন করার সময় উপলব্ধ হবে না
.ষি

4
এটি আমার পক্ষে কাজ করেছিল, তবে প্রকল্পটি তৈরির পরে আমাকে প্রথমে ভিএস 2013 পুনরায় চালু করতে হয়েছিল। @ অবিলিভিয়াসেজ - মাথা উঁচু করার জন্য ধন্যবাদ; আমার বর্তমান ক্ষেত্রে কমপক্ষে এটি কোনও সমস্যা নয় তবে এটি সন্ধান করা ভাল।
ইন্টেক্সএক্স

10

@ স্ল্যামচ, সহায়ক উত্তরের জন্য ধন্যবাদ, কারণ আমি সম্প্রতি একই সমস্যাটিতে চলেছিলাম।

সংকলন সতর্কতাগুলি প্রতিরোধ করতে ( #if DEBUGপ্রাক-প্রসেসরের নির্দেশের মধ্যে বেস ক্লাসটি রেখে) নিম্নলিখিতটি আপনার পোস্টে একটি সামান্য পরিবর্তন রয়েছে :

public class Form1
#if DEBUG  
 : MiddleClass 
#else  
 : BaseForm 
#endif 

5

আমার একইরকম সমস্যা হয়েছিল তবে একটি বিমূর্ত বেস শ্রেণির জায়গায় ইন্টারফেস ব্যবহার করার জন্য জিনিসগুলি রিফ্যাক্টরের একটি উপায় খুঁজে পেয়েছি:

interface Base {....}

public class MyUserControl<T> : UserControl, Base
     where T : /constraint/
{ ... }

এটি প্রতিটি পরিস্থিতিতে প্রযোজ্য নাও হতে পারে তবে যখন সম্ভব হয় এটি শর্তসাপেক্ষ সংকলনের চেয়ে ক্লিনার সমাধানে আসে।


4
আপনি কি আরও কিছু সম্পূর্ণ কোড নমুনা সরবরাহ করতে পারেন? আমি আপনার নকশাটি আরও ভালভাবে বোঝার চেষ্টা করছি এবং আমি এটিও ভিবিতে অনুবাদ করব। ধন্যবাদ
ইনটেক্সএক্স

আমি জানি এটি পুরানো তবে আমি খুঁজে পেলাম এটি হ'ল সমাধান। যেহেতু আমি এখনও আমার ইন্টারফেসটি ইউজারকন্ট্রোলের সাথে আবদ্ধ থাকতে চেয়েছি, তাই আমি UserControlইন্টারফেসে একটি সম্পত্তি যুক্ত করেছি এবং উল্লেখ করেছি যে যখনই আমার সরাসরি এটিতে অ্যাক্সেসের প্রয়োজন হয়। আমার ইন্টারফেস বাস্তবায়নে, আমি ইউজারকন্ট্রোলকে প্রসারিত করি এবং UserControlসম্পত্তিটি সেট করিthis

3

আমি এই প্রশ্নের উত্তরটিতে সমাধানটি ব্যবহার করছি অন্য প্রশ্নের, যা এই নিবন্ধটি যুক্ত করেছে । নিবন্ধটি TypeDescriptionProviderবিমূর্ত শ্রেণীর একটি কাস্টম এবং কংক্রিট বাস্তবায়ন ব্যবহার করার পরামর্শ দেয় । ডিজাইনার কাস্টম সরবরাহকারীকে জিজ্ঞাসা করবে যে কোন প্রকারটি ব্যবহার করতে হবে এবং আপনার কোডটি কংক্রিট ক্লাসটি ফিরিয়ে আনতে পারে যাতে ডিজাইনার খুশি থাকে যখন আপনি কীভাবে অ্যাবস্ট্রাক্ট শ্রেণিটি একটি কংক্রিট শ্রেণীরূপে প্রদর্শিত হবে তার সম্পূর্ণ নিয়ন্ত্রণ থাকে।

আপডেট: আমি অন্য প্রশ্নের আমার উত্তর একটি ডকুমেন্টেড কোড নমুনা অন্তর্ভুক্ত । সেখানকার কোডটি কাজ করে, তবে কখনও কখনও আমাকে একটি পরিষ্কার / বিল্ড চক্রের মধ্য দিয়ে যেতে হয় আমার কাজকর্মটি পেতে এটির উত্তর হিসাবে উল্লিখিত।


3

আমি এমন লোকদের জন্য কিছু টিপস পেয়েছি যারা বলে যে TypeDescriptionProviderজুয়ান কার্লোস ডিয়াজ লিখেছেন যে কাজ করছে না এবং শর্তসাপেক্ষ সংকলনও পছন্দ করে না:

প্রথমত, ফর্ম ডিজাইনারে কাজ করার জন্য আপনার কোডের পরিবর্তনের জন্য আপনাকে ভিজ্যুয়াল স্টুডিও পুনরায় চালু করতে হতে পারে (আমার ছিল, সাধারণ পুনর্নির্মাণটি কার্যকর হয়নি - বা প্রতিবার নয়)।

আমি বিমূর্ত বেস ফর্ম ক্ষেত্রে আমার এই সমস্যার সমাধানটি উপস্থাপন করব। ধরা যাক আপনার একটি BaseFormক্লাস রয়েছে এবং আপনি চান এর উপর ভিত্তি করে যে কোনও ফর্ম ডিজাইনেযোগ্য হতে পারে (এটি হবে Form1)। TypeDescriptionProviderযেমন জুয়ান কার্লোস ডিয়াজ দ্বারা উপস্থাপিত আমার জন্য কাজ করে নি। এখানে আমি মিডল ক্লাস সমাধান (গন্ধ দ্বারা) এর সাথে যুক্ত হয়ে এটি কীভাবে কাজ করেছি তা শর্তযুক্ত সংকলন ছাড়াই#if DEBUG এবং কিছু সংশোধন করে:

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<BaseForm, BaseFormMiddle2>))]   // BaseFormMiddle2 explained below
public abstract class BaseForm : Form
{
    public BaseForm()
    {
        InitializeComponent();
    }

    public abstract void SomeAbstractMethod();
}


public class Form1 : BaseForm   // Form1 is the form to be designed. As you see it's clean and you do NOTHING special here (only the the normal abstract method(s) implementation!). The developer of such form(s) doesn't have to know anything about the abstract base form problem. He just writes his form as usual.
{
    public Form1()
    {
        InitializeComponent();
    }

    public override void SomeAbstractMethod()
    {
        // implementation of BaseForm's abstract method
    }
}

বেসফর্ম ক্লাসে বৈশিষ্ট্যটি লক্ষ্য করুন Notice তারপরে আপনাকে কেবল দুটিTypeDescriptionProvider এবং দুটি মধ্যবিত্ত শ্রেণির ঘোষণা করতে হবে, তবে চিন্তা করবেন না, তারা ফর্ম 1 এর বিকাশকারীদের জন্য অদৃশ্য এবং অপ্রাসঙ্গিক । প্রথমটি বিমূর্ত সদস্যদের প্রয়োগ করে (এবং বেস শ্রেণিকে বিমূর্ত করে তোলে)। দ্বিতীয়টি খালি - এটি কেবল ভিএস ফর্ম ডিজাইনারের কাজ করা প্রয়োজন। তারপর আপনি নির্ধারণ দ্বিতীয় থেকে মধ্যবিত্ত TypeDescriptionProviderএর BaseFormকোনও শর্তসাপেক্ষ সংকলন নেই।

আমার আরও দুটি সমস্যা ছিল:

  • সমস্যা 1: ডিজাইনারে ফর্ম 1 পরিবর্তন করার পরে (বা কিছু কোড) এটি আবার ত্রুটি দিচ্ছিল (আবার ডিজাইনারে এটি খোলার চেষ্টা করার সময়)।
  • সমস্যা 2: বেস ফর্মের নিয়ন্ত্রণগুলি ভুলভাবে স্থাপন করা হয়েছিল যখন ফর্ম 1 এর আকার ডিজাইনারে পরিবর্তন করা হয়েছিল এবং ফর্মটি বন্ধ করে ফর্ম ডিজাইনারটিতে আবার খোলা হয়েছিল।

প্রথম সমস্যা (আপনার এটি নাও থাকতে পারে কারণ এটি এমন কিছু যা আমার প্রকল্পে আরও কয়েকটি জায়গায় আমাকে হান্ট করে এবং সাধারণত "টাইপ এক্সকে টাইপ এক্স তে রূপান্তর করতে পারে না" ব্যতিক্রম উত্পন্ন করে)। আমি এর মধ্যে মীমাংসিত TypeDescriptionProviderদ্বারা টাইপ নামের তুলনা (FULLNAME) পরিবর্তে ধরনের তুলনা (নিচে দেখুন)।

দ্বিতীয় সমস্যা। আমি জানি না কেন বেস ফর্মটির নিয়ন্ত্রণগুলি ফর্ম 1 শ্রেণিতে ডিজাইনযোগ্য নয় এবং আকারগুলি পরিবর্তন করার পরে তাদের অবস্থানগুলি হারিয়ে গেছে, তবে আমি এটি প্রায় কাজ করেছি (একটি দুর্দান্ত সমাধান নয় - আপনি যদি আরও ভাল জানেন তবে দয়া করে লিখুন)। আমি কেবল বেসফর্মের বোতামগুলি (যা নীচে-ডান কোণে থাকা উচিত) বেসফর্মের লোড ইভেন্ট থেকে অ্যাসিঙ্ক্রোনিকভাবে অনুরোধ করা পদ্ধতিতে তাদের সঠিক অবস্থানগুলিতে ম্যানুয়ালি সরিয়ে নিয়েছি: BeginInvoke(new Action(CorrectLayout));আমার বেস শ্রেণিতে কেবল "ঠিক আছে" এবং "বাতিল" বোতাম রয়েছে, তাই কেস সহজ।

class BaseFormMiddle1 : BaseForm
{
    protected BaseFormMiddle1()
    {
    }

    public override void SomeAbstractMethod()
    {
        throw new NotImplementedException();  // this method will never be called in design mode anyway
    }
}


class BaseFormMiddle2 : BaseFormMiddle1  // empty class, just to make the VS designer working
{
}

এবং এখানে আপনার সামান্য পরিবর্তিত সংস্করণ রয়েছে TypeDescriptionProvider:

public class AbstractControlDescriptionProvider<TAbstract, TBase> : TypeDescriptionProvider
{
    public AbstractControlDescriptionProvider()
        : base(TypeDescriptor.GetProvider(typeof(TAbstract)))
    {
    }

    public override Type GetReflectionType(Type objectType, object instance)
    {
        if (objectType.FullName == typeof(TAbstract).FullName)  // corrected condition here (original condition was incorrectly giving false in my case sometimes)
            return typeof(TBase);

        return base.GetReflectionType(objectType, instance);
    }

    public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
    {
        if (objectType.FullName == typeof(TAbstract).FullName)  // corrected condition here (original condition was incorrectly giving false in my case sometimes)
            objectType = typeof(TBase);

        return base.CreateInstance(provider, objectType, argTypes, args);
    }
}

এবং এটাই!

আপনার বেসফর্মের ভিত্তিতে ফর্মগুলির ভবিষ্যত বিকাশকারীদের আপনাকে কিছু ব্যাখ্যা করতে হবে না এবং তাদের ফর্মগুলি ডিজাইন করার জন্য তাদের কোনও কৌশল করতে হবে না! আমি মনে করি এটি সবচেয়ে পরিষ্কার সমাধান হতে পারে (নিয়ন্ত্রণের স্থিতিস্থাপকতা বাদে)।

আরও একটি টিপ:

কিছু কারণে ডিজাইনার এখনও আপনার জন্য কাজ করতে রাজি থাকে, তাহলে আপনি সবসময় পরিবর্তনের সহজ কৌতুক করতে পারেন public class Form1 : BaseFormথেকে public class Form1 : BaseFormMiddle1(অথবা BaseFormMiddle2কোড ফাইলে), বনাম ফর্ম ডিজাইন ব্যবস্থার মধ্যে সম্পাদনার এবং তারপর ফিরে আবার পরিবর্তন। আমি এই কৌশলটি শর্তসাপেক্ষ সংকলনের চেয়ে বেশি পছন্দ করি কারণ এটি ভুল সংস্করণটি ভুলে যাওয়ার এবং প্রকাশের সম্ভাবনা কম


4
এটি ভিএস ২০১৩-তে হুয়ানের সমাধান নিয়ে আমার যে সমস্যাটি ছিল তা সমাধান করেছে; ভিএস পুনরায় চালু করার সময় নিয়ন্ত্রণগুলি এখন নিয়মিত লোড হয়।
লুক মেরেট

3

হুয়ান কার্লোস ডিয়াজ সলিউশনটির জন্য আমার একটি টিপ রয়েছে। এটি আমার পক্ষে দুর্দান্ত কাজ করে তবে এতে কিছুটা সমস্যা ছিল। আমি যখন ভিএস শুরু করি এবং ডিজাইনার প্রবেশ করি তখন সবকিছু ঠিকঠাক কাজ করে। সমাধানটি চালানোর পরে, তারপরে থামুন এবং এটিকে প্রস্থান করুন এবং তারপরে ভিএস পুনরায় চালু না হওয়া পর্যন্ত ব্যতিক্রমটি আবার এবং আবার প্রদর্শিত হবে enter তবে আমি এর সমাধান খুঁজে পেয়েছি - যা করতে হবে তা হ'ল নীচে আপনার অ্যাপ্লিকেশন add

  <appSettings>
   <add key="EnableOptimizedDesignerReloading" value="false" />
  </appSettings>

2

যেহেতু বিমূর্ত শ্রেণি public abstract class BaseForm: Formএকটি ত্রুটি দেয় এবং ডিজাইনারের ব্যবহার এড়ায়, তাই আমি ভার্চুয়াল সদস্যগুলির ব্যবহার নিয়ে এসেছি। মূলত, বিমূর্ত পদ্ধতি ঘোষণা করার পরিবর্তে, আমি সর্বনিম্ন শরীরের সাথে ভার্চুয়াল পদ্ধতিগুলি সম্ভব হিসাবে ঘোষণা করেছিলাম। আমি যা করেছি তা এখানে:

public class DataForm : Form {
    protected virtual void displayFields() {}
}

public partial class Form1 : DataForm {
    protected override void displayFields() { /* Do the stuff needed for Form1. */ }
    ...
}

public partial class Form2 : DataForm {
    protected override void displayFields() { /* Do the stuff needed for Form2. */ }
    ...
}

/* Do this for all classes that inherit from DataForm. */

যেহেতু DataFormবিমূর্ত সদস্যের সাথে বিমূর্ত শ্রেণি হওয়ার কথা ছিল তাই displayFieldsআমি বিমূর্ততা এড়াতে ভার্চুয়াল সদস্যদের সাথে এই আচরণটি "নকল" করি " ডিজাইনার আর অভিযোগ করেন না এবং আমার পক্ষে সবকিছু ঠিকঠাক কাজ করে।

এটি একটি কার্যকরী আরও পাঠযোগ্য, তবে এটি যেহেতু বিমূর্ত নয়, তাই আমাকে নিশ্চিত করতে হবে যে সমস্ত শিশু শ্রেণির DataFormতাদের প্রয়োগ রয়েছে displayFields। সুতরাং, এই কৌশলটি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন।


এই যে আমি সঙ্গে গিয়েছিলাম। ত্রুটিটি ভুলে গেলে তা সুস্পষ্ট করতে আমি কেবল বেস ক্লাসে নোট-ইমপ্লিমেন্টেড এক্সেপশনটি ছুঁড়েছি।
শন রোয়ান

1

উইন্ডোজ ফর্ম ডিজাইনার আপনার ফর্ম / নিয়ন্ত্রণের বেস শ্রেণীর একটি উদাহরণ তৈরি করছে এবং এর পার্স ফলাফলটি প্রয়োগ করে InitializeComponent। এজন্য আপনি এমনকি প্রকল্পটি তৈরি না করেই প্রকল্প উইজার্ড দ্বারা তৈরি ফর্মটি ডিজাইন করতে পারেন। এই আচরণের কারণে আপনি কোনও বিমূর্ত ক্লাস থেকে নেওয়া একটি নিয়ন্ত্রণও ডিজাইন করতে পারবেন না।

আপনি এই বিমূর্ত পদ্ধতিগুলি প্রয়োগ করতে পারেন এবং ডিজাইনারে এটি চলমান না থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন। নিয়ন্ত্রণ থেকে প্রাপ্ত প্রোগ্রামারকে অবশ্যই এমন একটি বাস্তবায়ন সরবরাহ করতে হবে যা আপনার বেস শ্রেণীর বাস্তবায়নটিকে কল করে না। অন্যথায় প্রোগ্রাম ক্রাশ হবে।


করুণা, তবে এটি এখনও কীভাবে সম্পন্ন হয়েছে তা জানায়। এটি করার জন্য সঠিক উপায়ে প্রত্যাশা।
অলিভার ফ্রিডরিচ

আরও ভাল উপায় আছে, স্ল্যামচের উত্তর দেখুন
অ্যালেন রাইস

-1

আপনি শর্ত অনুসারে abstractএকটি পৃথক শ্রেণীর ইন্টারপোস না করে মূলশব্দটিতে সংকলন করতে পারেন :

#if DEBUG
  // Visual Studio 2008 designer complains when a form inherits from an 
  // abstract base class
  public class BaseForm: Form {
#else
  // For production do it the *RIGHT* way.
  public abstract class BaseForm: Form {
#endif

    // Body of BaseForm goes here
  }

এটি সরবরাহ করে যাতে BaseFormকোনও বিমূর্ত পদ্ধতি নেই ( abstractমূলশব্দটি কেবলমাত্র ক্লাসের রানটাইম ইনস্ট্যান্টেশন প্রতিরোধ করে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.