简短的问题: *需要深呼吸*
如何将TableRow中的ClientID添加到PlaceHolder中,PlaceHolder位于使用MasterPage添加到SharePoint页面的Web部件内的UserControl中?
解释:
我正在构建一个动态显示SPList项的usercontrol,每个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“onclick”属性显示showHidden('row999');
,它将'row999'传递给JavaScript函数,但我无法弄清楚如何获取它所引用的TableRow的完整clientId。 / p>
我的网页来源显示clientId为ctl00_SPWebPartManager1_g_eda9b9e9_4c7a_48e0_a2aa_fd8cdd65de6c_ctl00_row999
,比我以前看到的要长,并且似乎包含两个'ct100_'部分,提示多个级别的控件。
任何想法都将不胜感激。我已经尝试了所有常用的途径(谷歌搜索'javascript .net控制客户端ID'等等,但到目前为止我还没有找到任何有用的东西。大多数建议document.getElementById('<%= myControl.ClientId %>')...
这很好,但我不知道知道'myControl' - 我需要从切换图像发送。
手指越过!!
凯文
答案 0 :(得分:2)
如果你不能设置客户端ID,你应该能够设置一个类,并且应该被.nat尊重。
他们可以按类名选择元素。
答案 1 :(得分: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。