2017-02-02 34 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