2012-02-02 40 views
1

我需要構建一個帶有DetailsView的網頁,其中包含一組文本框以及綁定到ObjectContainerDataSource的下拉列表。這是使用InsertItemTemplate進行單向綁定的。在DetailsView中動態添加TemplateField並不會設置綁定屬性

我可以很容易地得到這兩個文本框和下拉列表使用靜態定義的字段,但是我的特殊情況需要在運行時添加字段,因爲網頁需要高度可配置。

對於文本框,通過BoundField類很容易,但是當我嘗試使用TemplateField作爲下拉列表時,這一切都變得非常糟糕。我已經嘗試了許多不同的方法,包括編寫自己的TemplateField類,並使用CompiledBindableTemplateBuilder直接設置InsertItemTemplate。但不管我做什麼,基本問題是在單擊插入按鈕後,TemplateFields不會綁定到對象數據源。我相信這是因爲InsertItemTemplate在回發時爲空(請注意,當所有字段都以標記聲明時,InsertItemTemplate不爲空)。如果有人已經完成了我想要做的事情,請回復,因爲我現在已經完成了我的繫繩。

我已經恢復回模板字段內的簡單文本框以進行概念證明,但它也不起作用。我粘貼了我在下面所做的。在這種情況下,我試圖將TextBox輸入綁定到名爲「CustomerRef」的屬性。我認爲我的問題可能與我如何設置Text屬性有關,但我無法找到任何其他方式將Text屬性設置爲在後面的代碼中綁定(...)。

這是我插入我的模板領域:

var tf = new TemplateField(); 
tf.InsertItemTemplate = new CompiledBindableTemplateBuilder(delegate(Control container) 
    { 

     TextBox text = new TextBox(); 
     text.ID = "MyTextBoxId"; 
     text.Attributes.Add("Text", "<%# Bind(\"CustomerRef\") %>"); 
     container.Controls.Add(text); 
    }, 
    delegate(Control container) 
    { // I've tried throwing an exception in here but it never gets executed 

     OrderedDictionary dict = new OrderedDictionary(); 
     dict["CustomerRef"] = ((TextBox)container.Controls[0]).Text; 
     return dict; 
    }); 

而且這是我的字段添加到我的DetailsView的字段列表:

ShipmentSearchView.Fields.Add(tf); 

我把一些文字的文本框,然後按插入按鈕...然後在插入事件的事件處理程序中,我嘗試獲取像這樣的數據源:

var dataSource = e.Instance as MyClassName; 

此時在調試環境中,我注意到有問題的字段不再具有InsertItemTemplate - 它是null,並且未設置MyCustomerRef。

我曾嘗試在Page_Load()中的各個位置添加字段 - 在每次回發時只在第一次加載時;在Page_Init()中,也在Details View的Init()事件中,但它似乎從未如此做過。提前感謝您對此問題的任何幫助。

回答

0

我最終編寫了自己的自定義用戶控件來實現這一目標 - 這確實不是那麼難。如果有人對我的解決方案感興趣,我很樂意在這裏發佈。但由於缺少對原文的評論,我猜測我在網頁上做的事情並不是很多人試圖做的!