WebControls.TableCell から派生したクラスがあります。Text プロパティが設定されたら、asp:Panels と asp:LiteralControls をセルに動的に追加するメソッドを呼び出します。これらのコントロールを Javascript で参照したいので、当然 JS 関数でパネルの ClientId を使用してみました。ただし、これらのコントロールには ClientId が設定されていません (文字列は空です)。どうしてこれなの?ClientIds を強制的に設定するにはどうすればよいですか?
一時的な解決策として、ClientIDMode を "static" に設定し、ID を独自に作成しましたが、JS でそれらの ID を参照するのが難しいため、これでは満足できません。なんで?たとえば、「12345」を 1 つのコントロールに割り当てると、クライアント側で「MainContent_123456」のように変更されます。「MainContent」部分が修正されていないため、これは悪いことです。したがって、クライアント側の実際の ID がどうなるかはわかりません。現在、jQuery を使用してコントロールを取得できますが$ctrl = $('[id$='12345']');
、ID に「123456」が含まれるコントロールを取得するため、これはダーティです。
それでは、元の質問に戻ります。カスタム TableCells のパネルに ClientIds を自動的に設定するにはどうすればよいですか?
編集:コードが追加されました
protected void Page_Load(object sender, EventArgs e)
{
this.ClientIDMode = System.Web.UI.ClientIDMode.Static;
}
コントロールをカスタム TableCell に追加するメソッドのコード:
Panel remainingTextPanel = new Panel();
remainingTextPanel.ID = Guid.NewGuid().ToString();
remainingTextPanel.Style["display"] = "none";
LiteralControl remainingText = new LiteralControl(myText.Substring(initialStringLength, myText.Length - initialStringLength));
remainingTextPanel.Controls.Add(remainingText);
this.Controls.Add(remainingTextPanel);
Panel linkBtnPanel = new Panel();
LinkButton lnkBtn = new LinkButton() {Text = "...", OnClientClick = "toggleDynamicText('" + remainingTextPanel.ID + "'); return false;" };
lnkBtn.Font.Bold = true;
linkBtnPanel.Controls.Add(lnkBtn);
this.Controls.Add(linkBtnPanel);
そしてJSコード:
function toggleDynamicText(id) {
$ctrl = $('[id$=' + id + ']');
$(document).ready(function () {
$ctrl.toggle(1000);
});
}