How is ID work in asp: TextBox? - c#

I'm very new in .net c#, just a question here to about the following code. I have wrote a code to display a text box on the screen as below:
<asp:TextBox ID="sUnit" runat="server" MaxLength="12" Width="3em" />
But somehow I failed to using jqueryto assign a value into this textbox:
$('#sUnit').val('test');
Surprisingly when I view the source code, and it show me the ID for the text box is like below:
<input name="ctl00$cplh$sUnit" type="text" maxlength="12" id="ctl00_cplh_sUnit" style="width:3em;" />
Does anyone know how can I get the textbox ID so that I can assigned the value into the textbox?
Hope my question is not sound stupid.

If you are using ASP.NET 4.0, set the ClientIDMode to static.
For older versions, use
$('#<%= sUnit.ClientID %>')

This is due to the fact that UI elements containing these controls are being rendered by ASP.NET, those containers that implement INamingContainer generate the prefix that should be prefixed as per their scope.
From the MSDN line mentioned above:
Any control that implements this
interface creates a new namespace in
which all child control ID attributes
are guaranteed to be unique within an
entire application. The marker
provided by this interface allows
unique naming of the dynamically
generated server control instances
within the Web server controls that
support data binding.
One suggestion in order to find the control itself might be to use the first selector, where you controls are contained within a regular div. An example to find elements of type input might look something like:
$('#MyDiv').first('input[type="text"]')

Related

asp.net runat="server" c#name does not exist in the current context

I have the following asp.net div setup on my page:
<div runat="server" id="ImageContainer">
<img src="images/<%# Eval("Image") %>" class="ArticleImage"/>
</div>
and I know this is being created at the server as when I view it in developer tools its id is:
ctl00_body_ArticleInfoRepeater_ctl00_ImageContainer
which is being created by the server.
I now want to edit the Css under certain conditions by doing the following:
ImageContainer.CssClass = "invisibleClass";
My problem is, in the C# code I am getting the following error:
The name 'Image container' does not exist in its current context.
I have no idea why this is happening, as it clearly does exist.
Any ideas?
Are you using some databinding control such as GridView, Repeater or some other?
The syntax <%#....%> represents data binding which works if it is placed inside some data binding control.
In such case you cannot access "ImageContainer" control directly. You have to search through parent control.
Since you haven't mentioned what is parent control of "ImageContainer" it's hard to give code sample here... Though here is example how it can be done in GridView
Incase, if you haven't used DataBindingControl then I would recommand to check yourpage.aspx.designer.cs and you should be able to find control name there!
Hope this will be helpful.
That's because you're trying to reference a dynamically created object (obiviously inside a repeater). Firstly, you shouldn't set ID for dynamic objects created during runtime. IDs have to be unique, or else you'll run into problems.
Secondly, you need to get the parent object (probably the repeater itself or the container?) and then traverse the collection of child controls to find the one you're after. There are numerous answers about how to find a control in an asp.net webforms, so just google for a while and I'm sure you'll get the code.
For instance find control
Controls placed on data list,repeater,grid-view are not accessed directly like other server controls placed on the page. If you want to access it through code behind you can access it on Data-bound or Item_command event of the repeater control because these controls itself act as containers for other controls placed on them.
you can use
e.Items.findControl("controlID") to access a particular row controls.
I recommend you to study these two events of repeater control.
if you want to change class of all div with name imagecontainer , you can use javascript or jquery for doing it with few lines of code.

Change every control like TextBox's max length in big Asp.net Application

I have a situation where i have a very big project and i want to change max length property of every textbox that exist in application. How can i do this with small effort and without overhead on server.
Create a new class where you inherit from the standard TextBox.
Set/override the MaxLength property in the new class.
Use ASP.NET tag mapping to replace all instances of the standard TextBox with your new one. In web.config:
<pages>
. . .
<tagMapping>
<add tagType="System.Web.UI.WebControls.TextBox"
mappedTagType="YouNamespace.YourTextBox" />
</tagMapping>
</pages>
TagMapping is done by the compiler, so there's no added runtime overhead.
You could also use a control adapter, but in this case I think tag mapping may be cleaner and easier.
You can use a control adapter to customize the rendering of all the controls of a specified type, so this way you have control over the max length accepted by the text box.
From the ControlAdapter documentation (emphasis is mine):
An adapter modifies a control for a specific browser or class of
browsers or acts as an arbitrary filter on some capability.
In this case the arbitrary filter would be a common MaxLength for all TextBox controls.
Refactor. If all your TextBox controls on the project derives from System.Web.TextBox then make your own MyTextBox that derives from System.Web.TextBox and make all your textboxes derives from this instead.
So, in, the MyTextBox just set the preferred MaxLength
Use search-replace option of text editors.
alternatively if you do not want to hard code it, use a common Java script file on page load. In this javascript set the MaxLenght of each TextBox of the page.
Something like this in Jquery should work for you
$(document).ready(function()
{
// replace 6 with new length you want to set
$('input[type=text], textarea').attr('maxlength','6');
});

ASP.NET web control only allow specific contents?

I am new to ASP .NET web controls, but not ASP .NET in general or C#.
I am wondering how I can limit the allowed content types to a specific class.
I have made a custom web control called TabPanel, and I want it to only be able to contain TabPages.
As an example, the following markup should be illegal, since it contains a checkbox.
<cc1:TabPanel ID="TabPanel1" runat="server">
<cc1:TabPage runat="server">
this is a simple test
</cc1:TabPage>
<cc1:TabPage runat="server">
this is another simple test
</cc1:TabPage>
<asp:CheckBox runat="server" />
</cc1:TabPanel>
In this case, I wouldn't want the checkbox to be there. How can I block this from happening?
I have not tried exactly what you are after but based on other things I have done I would try this:
Create a property in TabPannel that is a collection of TabPages (call it Tabs for demonstration purposes). This can be an array, a list, or a custom collection class, the key is to have typed to only accept TabPages as members.
Give the property the [PersistenceMode(PersistenceMode.InnerProperty)] atribute.
Override CreateChildControls to add the contents of the collection to the control.
If you do it this way then your mark up should end up looking something like this:
<cc1:TabPanel ID="TabPanel1" runat="server">
<Tabs>
<cc1:TabPage runat="server">this is a simple test</cc1:TabPage>
<cc1:TabPage runat="server">this is another simple test</cc1:TabPage>
</Tabs>
</cc1:TabPanel>
and it should not allow anything that is not a TabPage to be nested inside of the Tabs property.
http://msdn.microsoft.com/en-us/library/9txe1d4x(v=VS.90).aspx is a walk through demonstrating this technique in detail.
I figured it out.
Had to throw an exception under AddedControl procedure that I overrided from the WebControl if the type of the control being added was not of the type I wanted.
Now the designer shows a beautiful red error-message on the control itself, preventing me from doing such a foolish thing.
Awesome!
I'm going to take a guess here, but based on some quick googling I think you're looking for the ControlBuilder. The demo limits their control to an object called "mycell", but I don't see any reason why this couldn't be limited to your own objects, or build-in ASP.NET controls (i.e. Panels but not TextBoxes, etc.)
As a last resort, I'm sure you could hijack the rendering method and only render controls within the pre-determined class set, but this seems hack-ish at best.

When should I use a Localize control instead of a Literal?

I recently became aware of the System.Web.UI.WebControls.Localize control in a lab for the ASP.NET 4.0 MCTS certification course. The purpose of this control is unclear to me.
In the examples, the Literal control and the Localize control appear to be more-or-less interchangeable. Upon inspection, it appears that the Localize control inherits from Literal, but provides no additional functionality. It uses a different designer class, which appears to me to be less capable than the designer class for literals.
So, color me confused. Literals are localizable already. What is the Localize control used for? Should I use it, and under what circumstances?
I appreciate this has already been marked as answered, but here is another way to look at it.
<asp:Localize> is used to specify a Resource defined item, which forces the IDE to display some specified text, and still allows it to resolve at runtime, to the language of the website.
This may be useful for the development of a site where the content of the site is actually in a different language. So you would be able to be an English-speaking programmer, creating a website in Turkish, and still know what a <asp:Label> is supposed to without having to learn Turkish.
So as an example:
<asp:Localize runat="server" Text="<%$Resources : Label, Price%>">
Price
</asp:Localize>
Now, if my default Label.resx was translated into Turkish, the Labels.resx mapping would be:
Key="Price"
Value="fiyat"
At design time, the IDE would display Price (as the inner text of the <asp:Localize> element is Price) but the actual live view of the page in a web browser, would resolve to fiyat.
Therefore:
<div>
<asp:Localize runat="server"
Text="<%$Resources : Label, Price%>">
Price
</asp:Localize>
</div>
Becomes rendered as:
<div>fiyat</div>
But in the IDE Designer, this would be displayed as "Price".
The difference with labels, is that <asp:Label> will resolve to fiyat in both the IDE Designer and at run-time.
This described it best:
The Localize Control lets you localize any element on an .aspx page. It provides a design time feature not offered by its base class, the Literal control; in particular, the Localize control provides design time editing of static content so you can see a default value while working in page design mode.
Found at: http://wiki.asp.net/page.aspx/357/localize/
MSDN (bottom section has a good description)

ASP .NET - Run required field validator and calloutextender in code behind?

I am using ASP .NET (C#) and have a page with a listview linked to a sqldatasource.
The listview has a InsertItemTemplate which contains many textboxes. I want to make all the textboxes required via the RequiredFieldValidator (and the ValidatorCallOutExtender).
Is there a way to do this in the codebehind instead of the aspx page?
Ideally I would like the page to validate each control with the same method with only the error message changing.
I take it your question is about dynamically adding controls (and not about codebehind validation).
I didn't know and ran a few tests. It is possible to simply add (Validator)controls to the Controls property of the Form element, but controlling the order is not so simple (no Controls.Insert()).
So my advice would be not to use a plain TextBox but a UserControl. You could probably use Search&Replace to fix up the ItemTemplate.

Categories

Resources