2011-08-21 60 views
1

簡短的問題: *需要深呼吸*使用JavaScript,發現.NET控件的ClientID的母版頁內深嵌套

我怎能內表的TableRow的客戶端ID添加到佔位符,這是在用戶控件使用MasterPage添加到SharePoint頁面的Web部件內部?

解釋:
我正在構建一個usercontrol,動態顯示SPList項目,每個Web.UI.Table()。 Table()的第二行將首先被隱藏起來,其中一個圖像用於啓動一些JavaScript以在客戶端瀏覽器中隱藏/顯示該行(而不是使用回發或ajax - 我有理由)。

Table()然後被添加到UserControl中的PlaceHolder,然後由WebPart使用,並且該WebPart被添加到SharePoint頁面,該頁面當然使用MasterPage。考慮到它嵌套得如此之深,我很難找出JavaScript方法來查找TableRow的ClientID。

我的.ascx代碼看起來是這樣的..

<script type="text/javascript"> 
function showHidden(itemId) { 
    var controlId = document.getElementById('<%= phDownloadTable.ClientID %>'); 
    //alert(controlId); 
    document.getElementById(controlId).style.display = (document.getElementById(controlId).style.display == "table-row") ? "none" : "table-row"; 
} 
</script> 

<asp:PlaceHolder ID="phTable" runat="server"></asp:PlaceHolder> 

和我的.cs代碼隱藏的是這樣的..

Table myTable = new Table(); 
TableRow hiddenRow = new TableRow(); 
hiddenRow.ID = "row" + itemId; 
hiddenRow.Attributes.Add("style","display: none;"); 

... create TableCells and add to hiddenRow... 

TableRow displayRow = new TableRow(); 
TableCell toggleCell = new TableCell(); 
Image toggleImage = new Image(); 
toggleImage.ImageUrl = "/images/myimage"; 
toggleImage.Attributes.Add("onclick","javascript:showHidden('" + hiddenRow.ClientID + "'); 
toggleCell.Controls.Add(toggleImage); 
displayRow.Cells.Add(toggleCell); 

... create more TableCells and add to displayRow 

myTable.Rows.Add(displayRow); 
myTable.Rows.Add(hiddenRow); 

的結果是toggleImage 「點擊」 顯示屬性showHidden('row999');,它將'row999'傳遞給JavaScript函數,但我無法弄清楚如何獲取它引用的TableRow的完整clientId。

我的頁面的源顯示clientId爲ctl00_SPWebPartManager1_g_eda9b9e9_4c7a_48e0_a2aa_fd8cdd65de6c_ctl00_row999,這比我以前看到的長,似乎包含兩個'ct100_'部分,提示多級控件。

任何想法將不勝感激。我已經嘗試了所有常見的途徑(google.javascript控制客戶端id等),但到目前爲止我還沒有找到任何有用的信息。大多數人都建議document.getElementById('<%= myControl.ClientId %>')...這很好,但我不知道'myControl ' - 我需要從切換圖像發送

手指交叉!

凱文

+0

我想你會設置該行的'clientID'屬性,然後你應該能夠引用它,不是嗎? –

+0

ClientID是一個只讀字段,無法設置。我自己想過這件事,並發現了困難的方式:) – QMKevin

回答

2

如果你不能設置客戶端ID,你應該能夠設置一個類,這應該由.nat尊重。

他們可以按類名選擇元素。

+0

現在這是一個有趣的想法。只是測試添加'hiddenRow.CssClass =「行」+ itemId;'和網頁源顯示'class ='row999''很好!現在我只需要嘗試一些自定義的'getElementByClassId'功能,我應該金!我會更新作爲一個答案如果..不,當我開始工作。感謝您的想法。 – QMKevin

+0

而且,找到適當的getElementByClass()函數[這裏](http://www.actiononline。 biz/web/code/how-to-getelementsbyclass-in-javascript-the-code /),我現在有了一個工作頁面,而不必擔心母版頁,PlaceHolders等。 – QMKevin

0

JavaScript有沒有通配符選擇選項嘗試使用jQuery,這使事情變得更加靈活 然後就可以使用。例如:

$("tr[id*='<%= phDownloadTable.ClientID %>']").css("display", your value); 

這樣,即使將它移動到頁面上的其他位置,您仍然可以找到正確的元素。

下面是關於如何使用這些通配符選擇一個更詳細的解釋: http://api.jquery.com/attribute-contains-selector/

用普通的JavaScript你可以做document.getElementsByTagName(「TR」),然後循環那些找到合適的對象。

如果您正在使用Framework 4.0中,你可以設置頁面的ClientIDMode是這樣的:

Page.ClientIDMode = System.Web.UI.ClientIDMode.Static; 

這樣,你可以有更多的可預見的客戶端ID。例如,您可以擁有沒有所有ctl00_前綴的id。

+0

不幸的是,jQuery在這一點上不是一個選項 - 我根本沒有時間學習jQuery來做到這一點,特別是當這應該是可能的使用JavaScript作爲它 - 這只是找出正確的語法。儘管 – QMKevin

+0

如果您使用Framework 4.0,還可以使用ClientIdMode來更好地控制生成的ClientId。我會用這個選項更新我的答案。 – Tys

+0

但是,對於SharePoint,我將使用4.0,但SharePoint是3.5或更低:( – QMKevin

相關問題