accessing Hyperlink Server Control within Repeater HeaderTemplate - c#

How to access the 'HyperlinkID1' control with the headertemplate?
I like to change the value like below but i can't access the control because it keep telling that "The name 'HyperlinkID1' does not exist in the current context"
if (!IsPostBack)
{
HyperlinkID1.ImageUrl = "asc.jpg";//change image
}
else
{
HyperlinkID1.ImageUrl = "asc.jpg";//change image
}
<%# Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<script language="C#" runat="server">
public class PositionData
{
private string name;
private string ticker;
public PositionData(string name, string ticker)
{
this.name = name;
this.ticker = ticker;
}
public string Name
{
get
{
return name;
}
}
public string Ticker
{
get
{
return ticker;
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HyperlinkID1.ImageUrl = "asc.jpg";//change image
}
else
{
HyperlinkID1.ImageUrl = "asc.jpg";//change image
}
if (!IsPostBack)
{
ArrayList values = new ArrayList();
values.Add(new PositionData("Microsoft", "Msft"));
values.Add(new PositionData("Intel", "Intc"));
values.Add(new PositionData("Dell", "Dell"));
Repeater1.DataSource = values;
Repeater1.DataBind();
}
}
</script>
<body>
<form runat="server">
<b>Repeater1:</b>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table border="1">
<tr>
<td><b>Company</b>
<asp:HyperLink ID="HyperlinkID1" runat="server" ImageUrl="desc.jpg" NavigateUrl="nextpage.aspx">HyperLink</asp:HyperLink></td>
<td><b>Symbol</b></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# DataBinder.Eval(Container.DataItem, "Name") %> </td>
<td><%# DataBinder.Eval(Container.DataItem, "Ticker") %> </td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</form>
</body>
</html>

The control does not exist. You need to declare an OnItemCreated method linked to your repeater, and in this do a FindControl for the control name, and set the value in this.
ETA - in response to the comment.
<asp:Repeater OnItemCreated="rptItemCreated" >
.
.
.
And in the code you need to define the new method defined:
protected void rptItemCreated(Object Sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Header)
{
HtmlAnchor HyperLinkID1=(HtmlAnchor)e.Item.FindControl("HyperLinkID1");
HyperlinkID1.ImageUrl = IsPostBack?"asc.jpg":"asc.jpg;
}
}
Note this is typed from memory, and so may need some tweaking. Also I have put the code you had into an abreviated form, which is equivalent but briefer to format.

Related

Dynamically create controls in C# (ASPX/Web) from database record and fetch control data

Folks,
Need one help in creating the dynamic controls in C#.
Like, I am putting ID, Text and all the mandatory validation properties into the database and from that values I need to create a control in ASP WinForm or Web page.
Please suggest me the view part to achieve the same.
here is my database table template
CREATE TABLE CONTROL(
PK_CONTROL_ID VARCHAR(128) NOT NULL,
CONTROL_NAME VARCHAR(128) NOT NULL,
PRIMARY KEY(CONTROL_ID)
);
CREATE TABLE CONTROLPROPERTY(
PK_PROPERTY_ID INT NOT NULL IDENTITY(1,1),
FK_CONTROL_ID INT NOT NULL FOREIGN KEY REFERENCES CONTROLPROPERTY(PK_CONTROL_ID),
CONTROLPROPERTY VARCHAR(128) NOT NULL,
CONTROLVALUES VARCHAR(128) NOT NULL,
PRIMARY KEY(PK_PROP_VALUE_ID)
);
**Example**
PK_CONTROL_ID CONTROL_NAME
1 TextBox
PK_PROPERTY_ID FK_CONTROL_ID CONTROLPROPERTY CONTROLVALUES
1 1 ID txtName
2 1 Visible true
3 1 ToolTip Name
Refered this example but I need to implement same table structure for the different types of controllers
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="TestControlFirst.index" %>
<%# Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load (object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Firstname");
dt.Columns.Add("Lastname");
for (int i = 0; i < 10; i++)
{
DataRow row = dt.NewRow();
row.ItemArray = new object[] {i,"Joe_"+i.ToString(),"Blow" +i.ToString()};
dt.Rows.Add(row);
Repeater1.DataSource = dt;
Repeater1.DataBind();
}
}
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
int rowid = (e.Item.ItemIndex);
TextBox tb = (TextBox)Repeater1.Items[rowid].FindControl("txtOne");
Label2.Text = tb.Text;
}
</script>
ASPX page
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Repeater Demo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand">
<HeaderTemplate>
<table border="1" width="50%">
<tr>
<th>SELECT</th>
<th>ID</th>
<th>FIRST</th>
<th>LAST</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><asp:Button ID="btnOne" runat="server" Text="SELECT" /></td>
<td> <asp:TextBox ID="txtOne" runat="server" Text='<%# Eval("ID") %>' /></td>
<td><%# Eval("Firstname") %></td>
<td><%# Eval("LastName") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
<asp:Label ID="Label2" runat="server"></asp:Label>
</form>
</body>
</html>
Thanks in advance
Your best bet is to create dynamic Controls and add them to a PlaceHolder by looping the database rows and create Controls based on the row values. This needs to happen every time the page is loaded, and that includes a PostBack
while (reader.Read())
{
string controlType = reader["CONTROL_NAME"].ToString();
if (controlType == "TextBox")
{
TextBox textbox = new TextBox();
textbox.ID = reader["ID"].ToString();
textbox.Visible = Convert.ToBoolean(reader["Visible"]);
textbox.ToolTip = reader["ToolTip"].ToString();
PlaceHolder1.Controls.Add(textbox);
}
else if (controlType == "Label")
{
Label label = new Label();
label.ID = reader["ID"].ToString();
label.Visible = Convert.ToBoolean(reader["Visible"]);
label.Text = reader["Text"].ToString();
PlaceHolder1.Controls.Add(label);
}
else if (controlType == "Button")
{
//etc
}
}
And to read the form values on submit you basically need to do the same. Loop all the ID's and Control types from the database, create them dynamically and read their values.
As you can see this process can become complex real fast if you have a lot of different controls and rows, so think about your approach and see if this is the best solution.

How to get a URL file name without extension in a webmethod

I have this URL (mydomain.com/mypage.aspx). I want to get the file name "mypage" only in a webmethod. I tried the following code but I only get the name of the function itself (MyMethod). I don't get the name of the page from the URL. Any help is well appreciated.
EDIT
To be more specific the webmethod resides in a user control so using FilePath OR PhysicalPath would give me the name of the UserControl file name (MyUserControl) and not the aspx page (mypage) in the URL.
mypage.aspx
<asp:Content ID="Content" ContentPlaceHolderID="ContentPlaceHolder" runat="server">
<uc:myUserControl runat="server" />
</asp:content>
myUserControl.cs
public static string PageName { get {
return (string)(Path.GetFileNameWithoutExtension(
Convert.ToString(HttpContext.Current.Request.Url)));
} }
OR
public static string PageName { get {
return (string)(Path.GetFileNameWithoutExtension(
HttpContext.Current.Request.RawUrl));
} }
OR
public static string PageName { get {
return (string)(Path.GetFileNameWithoutExtension(
HttpContext.Current.Request.PhysicalPath));
} }
[WebMethod]
public static string MyMethod()
{
StringBuilder SBstring = new StringBuilder();
SBstring.Append(PageName);
return SBstring.ToString();
}
Just use FilePath like this:
var fi = new FileInfo(HttpContext.Current.Request.FilePath);
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fi.Name);
Complete working solution for required structure (Master Page -> Content Page -> User Control
Site Master
<%# Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="WebTester.Site1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Webform1.aspx:
<%# Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebTester.WebForm1" %>
<%# Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" />
</asp:Content>
Webform1.aspx.cs:
namespace WebTester
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod]
public static string ProcessIT(string name, string address)
{
return WebUserControl1.ProcessIT(name, address);
}
}
}
WebUserControl1.ascx:
<%# Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebTester.WebUserControl1" %>
<script type="text/javascript">
function HandleIT() {
var name = document.getElementById('<%=txtname.ClientID %>').value;
var address = document.getElementById('<%=txtaddress.ClientID %>').value;
PageMethods.ProcessIT(name, address, onSucess, onError);
function onSucess(result) {
alert(result);
}
function onError(result) {
alert('Something is wrong.');
}
}
</script>
<div>
<p>Please enter data:</p>
Name<br />
<asp:TextBox ID="txtname" runat="server"></asp:TextBox>
<br />
Address<br />
<asp:TextBox ID="txtaddress" runat="server"></asp:TextBox>
<br />
<asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="HandleIT(); return false;" />
</div>
WebUserControl1.ascx.cs:
namespace WebTester
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public static string ProcessIT(string name, string address)
{
var fi = new FileInfo(HttpContext.Current.Request.FilePath);
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fi.Name);
string result = string.Format("Name '{0}' and address '{1}' came from Page '{2}'", name, address, fileNameWithoutExtension);
return result;
}
}
}

Repeater does not show data

As posted earlier , Here is my HTML :
<%# Page Title="" Language="C#" MasterPageFile="~/VendorMaster.master" AutoEventWireup="true" CodeFile="PastOrders.aspx.cs" Inherits="PastOrders" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<br />
<asp:Repeater ID="rptr" runat="server">
<HeaderTemplate>
<div class="col-lg-4 col-md-4 col-sm-4 mb">
<a href="VendorProfile.aspx">
<div class="twitter-panel pn">
<i class="fa fa-twitter fa-4x"></i>
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "Name") %>
</ItemTemplate>
<FooterTemplate>
</div>
</a>
</FooterTemplate>
</asp:Repeater>
</asp:Content>
C# :
public partial class PastOrders : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["vendor"] != null)
{
if (!IsPostBack)
{
ArrayList values = new ArrayList();
values.Add(new Testing
{
Name = "Caterer"
});
values.Add(new Testing
{
Name = "Florist"
});
values.Add(new Testing
{
Name = "Cab Services"
});
rptr.DataSource = values;
rptr.DataBind();
}
}
else
{
Response.Redirect("VendorLogin.aspx");
}
}
public class Testing
{
public string Name { get; set; }
}
}
Now i want to generate 3 separate divs, with the Names on them as : "Caterer","Florist","Cab Services",etc.
Instead it is only generating one div with all the 3 names inside it .
I tried formatting it with the Header Template and the Footer Template where i put the parent divs and the anchor tag in the Header Template and the closing of the same in the Footer Template . Bt it doesn't produce the expected result still.
Now you do bind data, but you do not access your data within your repater. Change it to
<form id="form1" runat="server">
<asp:Repeater ID="rptr" runat="server" >
<ItemTemplate>
<div class="divStyle" id="divStyle">
<%# DataBinder.Eval(Container.DataItem, "Name") %>
</div>
</ItemTemplate>
</asp:Repeater>
</form>
and it should work!

FileUpload Null reference error

I want to use FileUpload Control to save Image to Database. The HasFiles return always false after I click on BtnSave. I tried with and without UpdatePanel but could not find the solution.
My code is:
protected void BtnSave_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile == true)
{
var ChNumber = txtNumber.Text;
string img = this.FileUpload1.PostedFile.FileName;
//Save image to database function
}
else
{
lblStatus.Text="Image not Uploaded";
}
}
Try with a simple form without UpdatePanel. Here's the markup:
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="BtnSave" runat="server" Text="Button" OnClick="BtnSave_Click" />
<asp:TextBox ID="txtNumber" runat="server"></asp:TextBox>
<asp:Label ID="lblStatus" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
And here's the code:
using System;
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtnSave_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile == true)
{
var ChNumber = txtNumber.Text;
string img = this.FileUpload1.PostedFile.FileName;
//Save image to database function
}
else
{
lblStatus.Text = "Image not Uploaded";
}
}
}
I set a brekapoint at if (FileUpload1.HasFile == true) and see the uploaded file is there.

Cannot Unregister UpdatePanel exception with Cross Page Posting

I am getting the dreaded exception "Cannot unregister UpdatePanel with ID 'UpdatePanel' since it was not registered with the ScriptManager" when trying to combine a popup window and some Cross-Page Posting. I've been able to reproduce the problem with a small example.
I have seen other questions that handle the Unload event for the UpdatePanel, but that doesn't seem to work with the addition of the Cross Page Posting.
How do I get around this issue?
To duplicate the issue with the code below:
Start the Setup page
Press the View Popup link
Close the popup
Press the Next button to transfer to the Target page
Press the Back button to transfer to the Setup page
Press the View link and close the popup
Press the Next button, and see the failure
Here are the highlights (forgive the length, but it should be cut-and-pastable):
Setup.aspx
<head runat="server">
<title>Setup </title>
<script type="text/javascript">
function openCenteredWindow(url, height, width, name, parms) {
//Snip setting up window location stuff
var win = window.open(url, name, winParms);
return win;
}
</script>
</head>
<body>
<h1>Setup Page</h1>
<form id="aspnetForm" runat="server">
<div>
<asp:TextBox ID="txtData" runat="server" Width="80%" Text="<%# Information %>" />
<br />
<asp:LinkButton ID="lbViewData" runat="server"
OnClientClick="aspnetForm.target='ViewDataPopup';"
Text="View In Popup" /> <br />
<asp:Button ID="btnNext" runat="server" Text="Next" OnClick="btnNext_Click" />
</div>
<div>
<br />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:updatepanel ID="UpdatePanel" runat="server" OnUnload="UpdatePanel_Unload"></asp:updatepanel>
</div>
</form>
</body>
Setup.Aspx.cs
public partial class Setup : System.Web.UI.Page
{
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (this.ViewState["Information"] != null)
_Information = this.ViewState["Information"].ToString();
}
protected override object SaveViewState()
{
this.ViewState["Information"] = _Information;
return base.SaveViewState();
}
protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null && PreviousPage is TargetPage)
{
_Information = ((TargetPage)PreviousPage).SetupData;
}
else if (!Page.IsPostBack)
{
_Information = String.Format("This test started at {0}", DateTime.Now);
}
Page.DataBind();
lbViewData.PostBackUrl = "ViewData.aspx?u=0";
lbViewData.Attributes.Add("onclick", "JavaScript:openCenteredWindow(\"ViewData.aspx?u=0\", 400, 300, \"ViewDataPopup\", 'scrollbars=yes');");
}
private string _Information;
public string Information
{
get { return _Information; }
}
protected void btnNext_Click(object sender, EventArgs e)
{
HttpContext.Current.Server.Transfer("~/TargetPage.aspx");
}
}
ViewData.aspx
<%# PreviousPageType VirtualPath="~/Setup.aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head runat="server">
<title>View Data</title>
<script type="text/javascript">
function fixForm() {
opener.document.getElementById("aspnetForm").target = "";
opener.document.getElementById("aspnetForm").action = "";
}
</script>
</head>
<body onload="fixForm()">
<form id="aspnetForm" runat="server">
<div>
<h2 >View Data</h2>
</div>
<asp:Label ID="lblData" runat="server" Text="<%# SetupData %>" />
</form>
</body>
ViewData.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null)
{
Setup setup = (Setup)PreviousPage;
this.SetupData = setup.Information ?? "Data not set in Setup Page";
}
Page.DataBind();
}
private string _setupData = "Did not get updated data";
protected string SetupData
{
get { return _setupData; }
set { _setupData = value; }
}
TargetPage.aspx
<%# PreviousPageType VirtualPath="~/Setup.aspx" %>
<body style="background-color: #9999BB">
<h1>Target Page</h1>
<form id="aspnetForm" runat="server">
<div>
<asp:Label ID="lblData" runat="server" Text="<%# SetupData %>" /><br />
<asp:Button ID="btnBack" runat="server" Text="Back" OnClick="btnBack_Click" />
</div>
</form>
</body>
TargetPage.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (this.PreviousPage == null)
Response.Redirect("Setup.aspx");
this.SetupData = PreviousPage.Information;
}
Page.DataBind();
}
public string SetupData
{
get { return ViewState["SetupData"].ToString(); }
set { ViewState["SetupData"] = value; }
}
protected void btnBack_Click(object sender, EventArgs e)
{
HttpContext.Current.Server.Transfer("~/Setup.aspx");
}
As you can see, it's enough to have the UpdatePanel just sitting on the page and doing nothing for this error to occur.

Categories

Resources