2017-02-02 36 views
0

我在應用程序的配置頁面上有幾個列表,用戶可以配置項目的順序以及特定應用程序頁面的選擇。我使用在運行時添加的動態控件的ID將它們從A移動到B,但目前這不起作用,因爲我的JavaScript無法檢索所選控件的ID。動態控件「ID」自動添加到「名稱」屬性中,而不是ID屬性

深入挖掘並進一步檢查後,動態控件沒有自動分配ID屬性,而是將ID應用於控件的name屬性,這就是JavaScript失敗的原因。

我使用動態HtmlGenericControls和Textboxes。

檢索ID的JavaScript,它在我將this.id切換到this.name時起作用。不過,我需要使用ID屬性。

document.getElementById('itemID').value = this.id; 

'itemID'是隱藏的輸入字段。

我試過應用runat =「server」,clientidmode =「static」/「autoID」,但目前還沒有運氣。

爲什麼我的動態控件將ID分配給name屬性而不是ID屬性?

有什麼缺失,我需要添加它使它適用於ID屬性?

如果您需要更多的信息,下面:-)只是評論

的網頁使用母版頁

附加信息,所以控件內容佔位符中添加的。

我已經嘗試在JavaScript中將ID添加到屬性中,但在執行以下操作時仍然爲null。添加後的動態控制的

this.id = this.name; 

TextBox selectedItem = (TextBox)exampleList.FindControl(itemID.Value); 

實施例:

<input name="ctl00$uniqueBody$ctl86" type="text" value="EXAMPLE" runat="server"> 

正如你可以看到的name屬性保持的ID。

回答

0

當您創建動態控制並希望它們具有id時,您需要在創建它們時指定它。

TextBox tb = new TextBox(); 
tb.ID = "TextBox1"; 
PlaceHolder1.Controls.Add(tb); 

現在,JavaScript可以通過自己的ID找到他們,並FindControl也會起作用。 FindControl以遞歸方式工作,所以首先需要在Master頁面上找到ContentPlaceHolder,然後在PlaceHolder之後找到動態創建的TextBox。

ContentPlaceHolder contentPlaceHolder = Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder; 
PlaceHolder placeHolder = contentPlaceHolder.FindControl("PlaceHolder1") as PlaceHolder; 
TextBox textbox = placeHolder.FindControl("TextBox1") as TextBox; 
+0

謝謝,我已經做到了這一點,並設法解決了這個問題所以我將這個標記爲答案,但是,這正是我想要避免的,因爲如果我不使用set ID,它會使一切變得更簡單。 – Chris

0

如果this.ID的值不是string,而是爲int類型,double等,你想分配給一個字符串值,當看到這樣的你的代碼的問題。您需要使用Convert.ToString(this.id)this.id.ToString()。後者不能單獨處理空值。

document.getElementById('itemID').value = Convert.ToString(this.id); 

document.getElementById('itemID').value = this.id.ToString(); 

你現在看到的是默認的方法,它打印控制Type。如果你看到這種類型,你可能通過了整個控制,而不是它的價值。這表明你需要檢查一個文本值。

document.getElementById('itemID').value = this.id.Text; 
+0

對不起,這點不會有什麼不同。這是因爲this.id爲空,因爲控件ID被設置爲name屬性。我會添加額外的信息來向您顯示問題。 – Chris

0

你試過:

this.name.id 

+0

我剛剛試過這個,沒有它沒有工作:(。唯一的區別是itemID.value等於「undefined」而不是「」。 – Chris