2017-04-12 65 views
0

如何获取使用javascript/jquery动态创建控件的客户端ID。Jquery/Javascript:我如何获得动态生成的控件的ClientID

我有一个日期选择器,如果值改变,它应该触发一个textchanged事件并执行一些功能。下面是我的脚本

function BindControlEvents() { 
    $(".datepicker").datepicker({ 
     format: 'mm/dd/yyyy', 
     autoclose: true, 
     todayBtn: 'linked' 
    }).on('changeDate', function (ev) { 
     __doPostBack('MainContent_dteFr1002', ''); 
    }).on('clearDate', function (ev) { 
     //to do 
    }); 
} 

//Initial bind 
    $(document).ready(function() { 
     BindControlEvents(); 
    }); 

//Re-bind for callbacks 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function() { 
     BindControlEvents(); 
    }); 

代码隐藏动态生成的文本框的DatePicker

protected void Page_Init(object sender, EventArgs e) 
{ 
     LoadControls(reportDefId); 
} 

protected void LoadControls(int reportDefId) 
{ 
    HtmlTableCell cellDate = new HtmlTableCell(); 
    TextBox dte = new TextBox(); 
    dte.ToolTip = "If you need to filter for blank dates, please select date range 1/1/1753-1/1/1753"; 
    dte.Attributes.Add("type", "text"); 
    dte.Attributes.Add("class", "datepicker"); 
    if (rfl.fieldDisplayName.Contains("Start") || rfl.fieldDisplayName.Contains("End")) 
     dte.ID = "dte" + id.ToString(); 
    else 
     dte.ID = "dteFr" + id.ToString(); 
    dte.Style["Width"] = "85px"; 
    dte.Style["Height"] = "24px"; 
    dte.TextChanged += new EventHandler(dte_TextChanged); 
    cellDate.Controls.Add(dte); 
} 

为了测试,我已经硬编码的客户端ID“MainContent_dteFr1002”的,看它是否触发textchnaged事件。它的确如此。所以我需要动态地传递cliendid值,其中cliendID包含dte。

我已经搜索,但我没有找到合适的答案。

请帮忙! 谢谢

回答

0

on on change函数应该自动引用触发它的动态控件。

alert(ev.target.id); 

是一种方式,你应该看到id。

$(this).attr("id"); 

this.id 

也应分别包含动态的ID。如果您的CliendID定义意味着除了事件触发的控件之外的其他内容,那么您应该指定它是什么以及它如何唯一地绑定到此事件上。

+0

添加上面的行工作正常。但是,在ChangeDate上给_doPostBack添加另一个日期选择器时,我每次更改/清除日期而不是关闭。如果我注释掉_doPostBack,datepicker工作正常。但我应该做回发并调用textchanged方法。调用代码隐藏方法的好方法是什么?我如何修改? – crony

+0

我有点困惑,然后需要从你的代码中看到更多的代码。每次你调用_doPostBack时,它会创建一个新的日期选择器?你想要的是那种行为吗?该代码片段是否在位于PageLoad()中的代码中创建日期选择器?如果这是带有Page.IsPostBack的回传,您可以检查后面的代码,如果它是PostBack,则可以有条件地说不要创建另一个日期选择器。在页面加载的服务端,你可以用这样的代码来获取回发参数以及字符串参数= Request [“__ EVENTARGUMENT”]; –

+0

是的,它创建了一个新的日期选择器。我不需要这种行为。我已经添加了datepicker文本框控件的代码。请找到并请建议!谢谢 – crony

0

让我们假设你有一个容器中的按钮。

<div class='ButtonContainer'> 
<button value="textChanges" id="MainContent_dteFr1002" /> 
</div> 
<input type="text" class='datepicker' value='2017-05-01' /> 

,那么你的事件可能看起来像这样

$(".datepicker").datepicker({ 
    format: 'mm/dd/yyyy', 
    autoclose: true, 
    todayBtn: 'linked' 
}).on('changeDate', function (ev) { 
    $(".ButtonContainer").find("button").click(); 
}).on('clearDate', function (ev) { 
    //to do 
}); 

//OR text changed on the same controller 

$(".datepicker").datepicker({ 
format: 'mm/dd/yyyy', 
autoclose: true, 
todayBtn: 'linked' 
}).on('changeDate', function (ev) { 
// (this) is the changes textbox 
var id = $(this).attr("id"); 
__doPostBack(id, ''); 
}).on('clearDate', function (ev) { 
       //to do 
}); 
1

可以存储ClientID每个控制供以后使用的地方。

List<string> dynamicID = new List<string>(); 
dynamicID.Add(dte.ClientID); 

或者给你的控件自制的ID和设置客户端ID模式为静态,这样他们就不会被ASPNET被重命名为MainContent_ID_5

dte.ID = "ID_" + index; 
dte.ClientIDMode = ClientIDMode.Static; 

或者向下导航控制路径,找到正确的ID,在这个例子中,TextBox被添加到PlaceHolder1作为第一个控件。

<%= PlaceHolder1.Controls[0].ClientID %> 
相关问题