متى عنصر تحكم في برمجيا أضاف TemplateField وقد وضعت لها 'الملكية ID؟

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

سؤال

ولدي TemplateField التي يتم إضافتها بشكل حيوي إلى GridView المخصصة.

void ITemplate.InstantiateIn(System.Web.UI.Control container)
    {
        switch (_templateType)
        {
            case ListItemType.Header:
                if (this.ParentGridView.ShowDeleteHeaderImage)
                {
                    Image hImg = new Image();
                    hImg.ImageUrl = this.ParentGridView.DeleteHeaderImageUrl;
                    hImg.AlternateText = "Mark for Deletion";
                    container.Controls.Add(hImg);
                }
                else
                {
                    Label l = new Label();
                    l.Text = "Del";
                    container.Controls.Add(l);
                }
                break;
            case ListItemType.Item:
                container.Controls.Add(new CheckBox());
                break;
            case ListItemType.EditItem:
                break;
            case ListItemType.Footer:
                QLImageButton deleteButton = new QLImageButton();
                deleteButton.Settings.ImageId = "cmdQLGVDelete";
                deleteButton.Settings.ImageUrl = this.ParentGridView.DeleteImageUrl;
                deleteButton.CommandName = "Delete";
                container.Controls.Add(deleteButton);
                break;
        }
    }

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

Dictionary<string, WebControl> GetRowControls(GridViewRow row)
...

rowControls.Add(ctrl.ID, (WebControl)ctrl);

...

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

ولكن عندما يكون عنصر التحكم وأضافت عنصر تحكم TemplateField حيوي ctrl.ID دائما لاغية وبالتالي فإن بيان فوق يطرح استثناء.

ولقد بحثت في هذا الامر مع العاكس لأنني وجدت أنني عندما درست المتغير في الإطار الفوري في VS 2005 أي؟ السيطرة، ctrl.ID أن قائمة قيمة. لقد أنشئت منذ أن هذا يرجع في سرد؟ السيطرة في الإطار الفوري، ويسمى ClientID proprty وClientID يدعو EnsureId ()، والذي بدوره يحدد الهوية.

public virtual string ClientID
{
    get
    {
        this.EnsureID();
        string uniqueID = this.UniqueID;
        if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator) >= 0))
        {
            return uniqueID.Replace(this.IdSeparator, '_');
        }
        return uniqueID;
    }
}

وهكذا أفترض أن ClientID، UniqueId وID كلها باطلة - على الرغم النحو الوارد أعلاه مجرد قراءة الأولين سوف تؤدي جميعا إلى أن يتم تعيين. لاحظ أيضا أن NamingContainer ليس لاغيا. تم تعيينه.

وهكذا عمل حول هذا بسيط جدا أي تحقق من ctrl.ID == لاغية وإذا كان الأمر كذلك مجرد قراءة ctrl.ClientID. و thats ما فعلته لأن الوقت الحكيم لقد حصلت حقا للحصول على تملص جرا. ولكن ما زلت مهتما في الجواب إذا كان أي شخص يعرف أنه من على قمة رؤوسهم.

لماذا هي قيمة ID لمراقبة الطفل، من TemplateField إضافتها بشكل حيوي، وضعت في وقت مختلف عن تلك التي تحكم أخرى؟

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

المحلول

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

<asp:Label runat="server">something</asp:Label>

لاحظ أيضا أنه إذا قمت بتشغيل عليه أن تحصل على فترة مع عدم وجود معرف.

نصائح أخرى

وفريدي هو الصحيح.

ولكم هي المسؤولة عن تحديد هويات داخل طريقة InstantiateIn. وكان من المنطقي أن ClientID السيارات يولد لهم إذا لم ينص على خلاف ذلك.

والضوابط المعلن الحصول على هوياتهم تعيينه من قبل باني الصفحة خلال تجميع صفحة. لو كنت لننظر في واحد من الملفات المؤقتة .cs ولدت في "مجلد الملفات المؤقتة ASP.NET"، كنت تجد شيئا من هذا القبيل (pragmas تجريد):

//creating a template field, where CopiledBindableTemplateBuilder is the ITemplate
//and its InstantiateIn = @__BuildControl__control9
@__ctrl.ItemTemplate = new System.Web.UI.CompiledBindableTemplateBuilder(
    new System.Web.UI.BuildTemplateMethod(this.@__BuildControl__control9),
    new System.Web.UI.ExtractTemplateValuesMethod(this.@__ExtractValues__control9));

//and @__BuildControl__control9 calling @__BuildControlButton1
private global::System.Web.UI.WebControls.Button @__BuildControlButton1()
{
    global::System.Web.UI.WebControls.Button @__ctrl;

    @__ctrl = new global::System.Web.UI.WebControls.Button();
    this.Button1 = @__ctrl;
    @__ctrl.ApplyStyleSheetSkin(this);
    @__ctrl.ID = "Button1"; //<-- here it gets an ID
    @__ctrl.Text = "Button";
    return @__ctrl;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top