سؤال

ملخص

أهلاً بكم،
حسنًا، مزيد من المغامرات مع عناصر التحكم المخصصة...

باختصار، لقد تعلمت ثلاث "فئات" رئيسية لعناصر التحكم المخصصة.لا تتردد في تصحيح لي إذا كان أي من هذا خطأ!

  1. عناصر تحكم المستخدم - الذي يرث منه تحكم المستخدم ويتم تضمينها داخل أسكس ملف.إن ما يمكنها فعله محدود جدًا، ولكنها طريقة سريعة وخفيفة للحصول على بعض القواسم المشتركة لواجهة المستخدم مع دعم المصمم.
  2. الضوابط المركبة المخصصة - هذه هي الضوابط التي ترث من التحكم في الويب حيث يمكنك إضافة عناصر التحكم الموجودة مسبقًا إلى عنصر التحكم الموجود داخل إنشاء عناصر تحكم الطفل طريقة.يوفر هذا مرونة كبيرة، لكنه يفتقر إلى دعم المصمم بدون تعليمات برمجية إضافية.فهي محمولة للغاية على الرغم من أنه يمكن تجميعها في ملف DLL.
  3. الضوابط المقدمة المخصصة - على غرار عناصر التحكم المركبة المخصصة، تتم إضافتها إلى مشروع مكتبة التحكم في الويب.يتم التحكم بشكل كامل في عرض عنصر التحكم بواسطة المبرمج عن طريق تجاوز يجعل طريقة.

افكاري..

حسنًا، أثناء اللعب بالمركبات المخصصة، وجدت ما يلي:

  • لديك القليل من التحكم/لا تملك أي تحكم في مخرجات HTML مما يجعل من الصعب "تصحيح الأخطاء".
  • ال إنشاء عناصر تحكم الطفل (والطرق اللاحقة) يمكن أن تنشغل بها حقًا عناصر التحكم.إضافة(myControl) في كل مكان.
  • لقد وجدت أن جداول العرض (سواء كانت للتخطيط أو المحتوى) غير ملائمة إلى حد كبير.

الأسئلة)..

لذا، أعترف أنني جديد على هذا الأمر، لذا قد أكون خارج نطاق القاعدة مع بعض النقاط المذكورة أعلاه.

  • هل تستخدم المركبات؟
  • هل لديك أي حيل رائعة للتحكم في مخرجات HTML؟
  • هل تقول فقط "فليذهب الأمر إلى الجحيم" وتمضي قدمًا وتنشئ عنصر تحكم مخصصًا؟

إنه شيء أحرص على تثبيته في ذهني لأنني أعرف مقدار ذلك جيد يمكن أن يؤدي تطوير التحكم إلى تقليل الوقت الإجمالي للتطوير.

وإنني أتطلع إلى إجاباتكم ^_^

هل كانت مفيدة؟

المحلول

أقول المضي قدمًا في التحكم المخصص المقدم.أجد أنه في معظم الحالات يمكن تنفيذ المركب واستخدامه بشكل أسهل في UserControl، ولكن أي شيء أبعد من ذلك ستحتاج إلى درجة أدق من التحكم (التورية غير مقصودة) لتستحق استراتيجية العرض الخاصة بك.

ربما تكون هناك عناصر تحكم بسيطة بما يكفي لتستحق المركب (على سبيل المثال، مربع نص مدمج مع منتقي البيانات المستند إلى javascript/dhtml، على سبيل المثال) ولكن بعيدًا عن هذا المثال، يبدو أن عناصر التحكم المقدمة المخصصة هي الحل الأمثل.

نصائح أخرى

إليك طريقة تمديد أخرى أستخدمها للعرض المخصص:

 public static void WriteControls
        (this HtmlTextWriter o, string format, params object[] args)
 { 
    const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
    var controls  = new Dictionary<string,Control>();

    for(int i =0; i < args.Length; ++i)
    { 
       var c = args[i] as Control; 
       if (c==null) continue;
       var guid = Guid.NewGuid().ToString();
       controls[guid] = c;
       args[i] = delimiter+guid+delimiter;
    }

    var _strings = string.Format(format, args)
                         .Split(new string[]{delimiter},
                                StringSplitOptions.None);
    foreach(var s in _strings)
    { 
       if (controls.ContainsKey(s)) 
           controls[s].RenderControl(o);
       else 
           o.Write(s);
    }
}

ثم، لتقديم مركب مخصص في طريقة RenderContents() أكتب هذا:

protected override void RenderContents(HtmlTextWriter o)
{ 
    o.WriteControls
         (@"<table>
               <tr>
                    <td>{0}</td>
                    <td>{1}</td>
               </tr>
             </table>"
            ,Text
            ,control1);
 }

روب، أنت على حق.النهج الذي ذكرته هو نوع من الهجين.تتمثل ميزة وجود ملفات ascx في أنه في كل مشروع رأيته، سيشعر المصممون براحة أكبر عند تحرير العلامات الفعلية ومع ascx يمكنك أنت والمصمم العمل بشكل منفصل.إذا كنت لا تخطط لإجراء تغييرات فعلية على CSS/الترميز/التصميم على عناصر التحكم نفسها لاحقًا، فيمكنك استخدام عنصر تحكم مخصص معروض.كما قلت، أسلوبي مناسب فقط للسيناريوهات الأكثر تعقيدًا (وهذه ربما هي الحالات التي تحتاج فيها إلى مصمم :))

غالبًا ما أستخدم عناصر التحكم المركبة.بدلاً من تجاوز Render أو RenderContents، ما عليك سوى تعيين CssClass لكل عنصر تحكم واستخدام أوراق الأنماط.بالنسبة لعناصر التحكم المتعددة. أضف، أستخدم طريقة الامتداد:

//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
 { foreach(Control control in controls) coll.Add(control);
 }

للعرض السريع والقذر، أستخدم شيئًا مثل هذا:

writer.Render(@"<table>
                   <tr><td>{0}</td></tr>
                   <tr>
                       <td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");

لتهيئة خصائص التحكم، أستخدم صيغة مُهيئ الخاصية:

childControl = new Control {  ID="Foo"
                            , CssClass="class1"
                            , CausesValidation=true;
                           };

إن استخدام عناصر التحكم المركبة المخصصة له فائدة في موقف يكون لديك فيه تطبيق ويب كبير وتريد إعادة استخدام أجزاء كبيرة في العديد من الأماكن.بعد ذلك ستضيف فقط عناصر تحكم فرعية لتلك التي تقوم بتطويرها بدلاً من تكرار نفسك.في مشروع كبير عملت عليه مؤخرًا، ما قمنا به هو ما يلي:

  • يحتوي كل عنصر تحكم مركب على حاوية.يستخدم كملف لكل شيء داخل التحكم.
  • يحتوي كل عنصر تحكم مركب على قالب.ملف ascx (بدون التوجيه <%Control%>) والذي يحتوي فقط على ترميز القالب.
  • تتم تهيئة الحاوية (كونها عنصر تحكم في حد ذاتها) من القالب.
  • تعرض الحاوية خصائص كافة عناصر التحكم الأخرى في القالب.
  • يمكنك فقط استخدام this.Controls.Add([the_container]) في عنصر التحكم المركب الخاص بك.

في الواقع، أنت بحاجة إلى فئة أساسية تعتني بتهيئة حاوية باستخدام القالب المحدد وأيضًا طرح استثناءات عند عدم العثور على عنصر تحكم في القالب.بالطبع من المحتمل أن يكون هذا مبالغة في تطبيق صغير.إذا لم يكن لديك تعليمات برمجية وترميز مُعاد استخدامها وتريد فقط كتابة عناصر تحكم بسيطة، فمن الأفضل استخدام عناصر تحكم المستخدم.

قد تتمكن من الاستفادة من هذه التقنية لتسهيل وقت التصميم:

http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

في الأساس، يمكنك إنشاء مثيل لعنصر تحكم المستخدم في وقت التشغيل باستخدام طريقة LoadControl، ثم تسليمه حقيبة حالة من نوع ما، ثم إرفاقه بشجرة التحكم.لذا فإن عنصر التحكم المركب الخاص بك سيعمل في الواقع كوحدة تحكم أكثر، وسيكون الملف .ascx بمثابة طريقة عرض.

وهذا من شأنه أن يوفر عليك مشكلة الاضطرار إلى إنشاء شجرة التحكم بأكملها وتصميم عنصر التحكم في C#!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top