Click Event for Dynamically Generate Linkbutton - c#

i created a simple registration page which have fields Name,Username and Password.. actually am checking the username with database whether that username already had or not...
suppose if that username already taken,then i display"Username Already Taken" message in label,and also i create dynamically 4 link buttons for username suggestions like
now when i click on linkbuttons,that are bind to username textbox.. here is my code
give me some idea how to bind that linkbutton to textbox..

You should minimize server requests from client, especially if you want to update UI controls. I suggest to use java script to update text box with new value.
for (int i = 0; i < 4; i++)
{
LinkButton lbtn = new LinkButton();
lbtn.OnClientClick = "document.getElementById('" + txtuname.ClientID + "').value = '"+txtuname.Text + i+"'; return false;";
lbtn.Text = txtuname.Text + i;
phlinks.Controls.Add(lbtn);
phlinks.Controls.Add(new LiteralControl(" "));
}

Try this
for (int i = 0; i < 4; i++)
{
LinkButton lbtn = new LinkButton();
lbtn.OnClientClick = "document.getElementById('" + txtuname.ClientID + "').value = this.innerText; return false;";
lbtn.Text = i.ToString();
phlinks.Controls.Add(lbtn);
}

Related

Dynamic Table: Link button to textbox cell by cell

I have a dynamic table, where, on every row I have a text box (txtCantitate) and a button (btnMinus). In the textbox I have quantity (int) and on the button click I want the quantity to decrease by one. Here you have what I have on the table:
Can you help me make the code for the buttons? The problem is that it is a dynamic button... on every record it has the same ID... I don't know how to do it...
My languages used on the project C#, .NET 4.5, js, Jquery.
cell = new HtmlTableCell();
HtmlInputButton btnMinus = new HtmlInputButton();
btnMinus.ID = "btnMinus";
btnMinus.Value = "-";
cell.Controls.Add(btnMinus);
row.Cells.Add(cell);
cell = new HtmlTableCell();
HtmlInputText txtCantitate = new HtmlInputText();
txtCantitate.ID = "txtCantitate";
txtCantitate.Value = publicatie.Cantitate.ToString();
cell.Controls.Add(txtCantitate);
row.Cells.Add(cell);
You need to set a click event on the button, which will perform the action you want:
You will need to set the ID of both the textbox and the button to match the row+cell index you're in first... since these are HtmlControls, you don't really have their index so you'll have to find a way to get these in there somehow (i won't code this for you, sorry).
btnMinus.ID = "btnMinus_" + CurrentRowIndex.ToString() + "_" + CurrentCellIndex.ToString();
txtCantitate.ID = "txtCantitate_" + CurrentRowIndex.ToString() + "_" + CurrentCellIndex.ToString();
then you will have to set the event handler...
server side click event handler setter (see below for actual event handler code):
btnMinus.Click += myButtonClick;
client-side click event handler setter:
btnMinus.Attributes.Add("onclick","JavaScript:myButtonClick(this);");
If you want to do the event handler code server-side:
private void myButtonClick(object sender, EventArgs e)
{
Button tmp = sender as Button;
string[] id = tmp.ID.Split(new string[]{"_"}, StringSplitOptions.None);
string textbox_ID = "txtCantitate" + "_" + id[1] + "_" + id[2];
TextBox txt = this.Controls.FindControl(textbox_ID) as TextBox;
int val = -1;
string finaltext = "";
if(int.TryParse(txt.Text, out val))
finaltext = (val-1).ToString();
else
finaltext = "Invalid number, Cannot decrement!";
txt.Text = finaltext;
}
If you want to do the event handler code client-side:
function myButtonClick(object sender)
{
//i'll let you figure this one out for yourself if you want to do it client-side, but it's very similar to the server-side one as far as logic is concerned...
}
Here is the solution,
Javascript
function MinusVal(ctrl)
{
var TextBox = $(ctrl).parent().next().find("input[type=text]");
var Value = parseInt(TextBox.val());
TextBox.val(Value - 1);
return false;
}
C# Backend
btnMinus.Attributes.Add("onclick", "MinusVal(this);");

Add Ajax CalendarExtender to a dynamic textBox in ASP.NET C#

Is there a way to add Ajax CalendarExtender to a dynamic ASP.NET textbox control? Basically I'm trying to do the following:
protected void Page_Load(object sender, EventArgs e)
{
database.DB myDB = new database.DB();
DataTable myVars = new DataTable();
string myTopicID = (string)Session["myTopicID"];
bool myInvite = (bool)Session["myInvite"];
bool mySig = (bool)Session["mySig"];
string myLogo = (string)Session["myLogo"];
string myImage = (string)Session["myImage"];
string myLanguage = (string)Session["myLanguage"];
myVars = myDB.getVarFields(myTopicID, myLanguage);
AjaxControlToolkit.CalendarExtender calenderDate = new AjaxControlToolkit.CalendarExtender();
for (int i = 0; i < myVars.Rows.Count; i++)
{
Label label = new Label();
TextBox text = new TextBox();
label.Text = Convert.ToString(myVars.Rows[i]["varName"]);
myPlaceHolder.Controls.Add(label);
text.ID = Convert.ToString(myVars.Rows[i]["varName"]);
myPlaceHolder.Controls.Add(new LiteralControl(" "));
myPlaceHolder.Controls.Add(text);
if (Convert.ToString(myVars.Rows[i]["varName"]).Contains("Date:"))
{
calenderDate.TargetControlID = "ContentPlaceHolder1_" + text.ID;
myPlaceHolder.Controls.Add(calenderDate);
}
myPlaceHolder.Controls.Add(new LiteralControl("<br />"));
}
}
The error I get when I run the code above is the following:
The TargetControlID of '' is not valid. A control with ID 'ContentPlaceHolder1_Date:' could not be found.
Which makes sense I suppose since the actual text box does not exist yet. But is there a way around this?
I think ASP.NET will be smart enough to handle it if you just use text.ID, you shouldn't need to add the ContentPlaceHolder1_ prefix.
If that doesn't work, you can use the TextBox' ClientIdMode property to set it to static, then text.ID will definitely work.
The following code worked locally for me:
AjaxControlToolkit.CalendarExtender calenderDate = new AjaxControlToolkit.CalendarExtender();
for (int i = 0; i < 2; i++)
{
Label label = new Label();
TextBox text = new TextBox();
label.Text = Convert.ToString("varName");
ph1.Controls.Add(label);
text.ID = "myId" + i;
ph1.Controls.Add(new LiteralControl(" "));
ph1.Controls.Add(text);
calenderDate.TargetControlID = text.ID;
ph1.Controls.Add(calenderDate);
ph1.Controls.Add(new LiteralControl("<br />"));
}
Only differences I think you may want to investigate: I'm using latest ControlToolkit from Nuget, I'm using a ToolkitScriptManager instead of default ScriptManager. One thing that may be important to you is making sure you make text.ID unique.

Dynamic C# Not rendering on page_load

I have a method which is intended to dynamically generate a series of divs based on the entry of a value from a dropdown list. However, I wish to reuse the same code to generate the tables on the first page_load when a number already exists.
This is where the method is called. It is called GenerateTables and it is called from the Page_Load event:
if (!IsPostBack)
{
AcademicProgramme programme;
if (Request.QueryString["id"] != null)
{
programme = academic.GetAcademicProgramme(Request.QueryString["id"]);
programmeName.Text = programme.Name;
PopulateView(programme);
GenerateTables(programme.Levels);
}
}
And here is the method itself (apologies for the size of the method):
private void GenerateTables(int count)
{
for (int i = 1; i < count + 1; i++)
{
LiteralControl title = new LiteralControl();
LiteralControl close = new LiteralControl();
LiteralControl close2 = new LiteralControl();
String script = "<div class=\"ModuleProgTable\"><h3>Level " + i + "</Modules></h3></br>";
title.Text = script;
AcademicTable.Controls.Add(title);
Panel panel = new Panel();
panel.ID = "Level" + i + "Modules";
PopulatePanel(panel, GetModulesSession(i));
Button a = new Button();
a.ID = "AddModule" + i;
a.Text = "Add Module";
a.Click += (OpenPopup);
AcademicTable.Controls.Add(panel);
AcademicTable.Controls.Add(a);
close.Text = "</div> <!-- Close here -->";
close2.Text = "</div>";
AcademicTable.Controls.Add(close);
}
}
The divs are clearly being populated because if I change the dropdown option then they appear on the PostBack without fail. It's when I try to get them to render on the first page_load that I am having problems.
Any feedback and advice would be greatly appreciated!
Regards,
-Michael

ASP.NET -> Adding a ButtonColumn to a DataTable or DataGridView (Programmatically)

Having the odd problem figuring out how to add a ButtonColumn to a DataTable (or, arguably, the DataGrid). All I want to do is be able to use the data from the datatable to tell a button to do something onClick, and I seem to be failing at it.
A google search did not show anything immediately useful, as they are all using ItemTemplates.
//dt.Columns.Add("Ajax Link", typeof(Literal));
ButtonColumn newButtonColumn = new ButtonColumn();
newButtonColumn.HeaderText = "Asp.Net Link";
dt.Columns.Add(); // Doesn't want newButtonColumn.
for (int i = 0; i < dt.Rows.Count; i++)
{
/*
Literal newAjaxLink = new Literal();
newAjaxLink.Text = "Test";//"<button type=\"button\" onclick=\"AjaxButton_onClick(" + dt.Rows[i]["UserInfoID"].ToString() + "); StoreUserInfoID(" + dt.Rows[i]["UserInfoID"].ToString() + "); ShowDiv();\">Ajax Link</button>";
dt.Rows[i]["Ajax Link"] = newAjaxLink; // #todo: HTML button that triggers an AJAX call for load the proper data into the fields. Also to make the DIV visible.
*/
Button newButton = new Button();
newButton.ID = dt.Rows[i]["UserInfoID"].ToString();
newButton.Text = "Asp.Net Link";
newButton.Click += new EventHandler(Button_Link_Click);
dt.Rows[i]["Asp.Net Link"] = newButton; //#todo: Just a button to open a new window with the proper ID.
}
Any ideas?
where are u adding the button to the respective thing?...seems u r just giving values to button,but not adding.
Try this
DataTable dt = new DataTable("Table");
DataColumn col = dt.Columns.Add("ID", typeof(Int32));
col.AllowDBNull = true;

get dynamically generated ajax textbox id

I have created a web application in which I need to generate textboxes depending upon the number the user enters.I have used Ajax and created textboxes dynamically but these textboxes are not accessible from code-behind.I have used find control but to no use.This is the code I use to generate textbox.
if (txtnobranches.Text != "")
{
if (Convert.ToInt32(txtnobranches.Text) != 0)
{
div_br.InnerHtml = "<table></table>";
tbl_br.Controls.Clear();
for (int i = 0; i < Convert.ToInt32(txtnobranches.Text); i++)
{
TableRow rowbr = new TableRow();
TableCell cellname = new TableCell();
cellname.Text = "Branch Location " + i.ToString();
rowbr.Cells.Add(cellname);
TableCell cellvalue = new TableCell();
cellvalue.Text = "";
TextBox txt = new TextBox();
txt.Text = "";
txt.ID = "txtbranchloc" + i.ToString();
cellvalue.Controls.Add(txt);
cellvalue.ID = "txtbranchloc" + i.ToString();
rowbr.Cells.Add(cellvalue);
tbl_br.Rows.Add(rowbr);
}
}
}
You can access the element by name using Request.Form["NameOfFormControl"] You will have to make little change in code.
In javascript
txt.Name = "txtbranchloc" + i.ToString();
In Code Behind
Note: Make sure you access it in postback otherwise you get null
if (Page.IsPostBack)
{
string firstTxtVal = Request.Form["txtbranchloc0"].ToString();
string secondTxtVal = Request.Form["txtbranchloc1"].ToString();
}
Using Request.Form Collection

Categories