I am getting an error("input string was not in a correct format") every time I click the lnkUpdate button. Am i missing something? I can't find what's wrong with the codes in the updating event
aspx
<table class="table table-bordered table-hover table-responsive">
<thead>
<tr>
<th>Product ID</th>
<th>Product Name</th>
<th>Received</th>
<th>Remaining</th>
<th>Ordered</th>
<th></th>
</tr>
</thead>
<tbody>
<asp:ListView ID="lvSODetails" runat="server"
onitemcanceling="lvSODetails_ItemCanceling"
onitemediting="lvSODetails_ItemEditing"
onitemupdating="lvSODetails_ItemUpdating" >
<ItemTemplate>
<tr>
<td><%# Eval("ProductID") %></td>
<td><%# Eval("ProductName") %></td>
<td><%# Eval("Received") %></td>
<td><%# Eval("Remaining")%></td>
<td><%# Eval("Quantity") %></td>
<td>
<asp:LinkButton ID="lnkEdit" runat="server"
class="glyphicon glyphicon-pencil" CommandName="Edit" />
</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<asp:Panel ID="pnlDetails" runat="server" DefaultButton="lnkUpdate">
<tr>
<td><asp:Label ID="lblID" runat="server" Text='<%# Eval("ProductID") %>' /></td>
<td><%# Eval("ProductName") %></td>
<td><asp:TextBox ID="txtQtyReceived" runat="server" /></td>
<td><asp:Label ID="lblRemaining" runat="server" Text='<%# Eval("Remaining") %>' /></td>
<td><%# Eval("Quantity") %></td>
<td>
<asp:LinkButton ID="lnkUpdate" runat="server"
class="glyphicon glyphicon-ok" CommandName="Update" />
<asp:LinkButton ID="lnkCancel" runat="server"
class="glyphicon glyphicon-remove" CommandName="Cancel" />
</td>
</tr>
</asp:Panel>
</EditItemTemplate>
</asp:ListView>
</tbody>
</table>
c# code
protected void lvSODetails_ItemEditing(object sender, ListViewEditEventArgs e)
{
lvSODetails.EditIndex = e.NewEditIndex;
GetInfo();
GetDetails();
}
protected void lvSODetails_ItemCanceling(object sender, ListViewCancelEventArgs e)
{
lvSODetails.EditIndex = -1;
GetInfo();
GetDetails();
}
protected void lvSODetails_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
string ProdID = (lvSODetails.Items[e.ItemIndex].FindControl("lblID") as Label).Text;
string Received = (lvSODetails.Items[e.ItemIndex].FindControl("txtQtyReceived") as TextBox).Text;
string Remaining = (lvSODetails.Items[e.ItemIndex].FindControl("lblRemaining") as Label).Text;
if (int.Parse(Received) < 0) // <~ this is where the code stops (error"input string was not in a correct format")
{
error.Visible = true;
lblError.Text = "Items received must not be lower than zero";
}
else if (int.Parse(Received) >= 0 && int.Parse(Received) <= int.Parse(Remaining))
{
SODetails = (DataTable)Session["sodelivery"];
foreach (DataRow row in SODetails.Rows)
{
if (row["ProductID"].ToString() == ProdID)
{
row["Received"] = Received;
break;
}
}
}
lvSODetails.EditIndex = -1;
GetInfo();
GetDetails();
}
~~~~ Edit ~~~~
listview databinding code
void GetDetails()
{
if (SODetails == null)
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT sod.ProductID, p.ProductName, sod.SOQtyReceived AS Received, " +
"(sod.SOQtyOrdered - sod.SOQtyReceived) AS Remaining, sod.SOQtyOrdered AS Quantity FROM SODetails AS sod " +
"INNER JOIN Products AS p ON sod.ProductID=p.ProductID WHERE sod.SONo=#SONo";
cmd.Parameters.Add("#SONo", SqlDbType.Int).Value = Request.QueryString["ID"].ToString();
SqlDataAdapter data = new SqlDataAdapter(cmd);
SODetails = new DataTable();
data.Fill(SODetails);
DataRow[] rowList = SODetails.Select();
foreach (DataRow dr in rowList)
{
dr["Received"] = "0";
}
lvSODetails.DataSource = SODetails;
lvSODetails.DataBind();
con.Close();
Session["sodelivery"] = SODetails;
}
else
{
lvSODetails.DataSource = SODetails;
lvSODetails.DataBind();
Session["sodelivery"] = SODetails;
}
}
Your problem isn't that you can't access the TextBox.
Use int.TryParse instead of int.Parse since you are reading user input.
int received;
if (!int.TryParse(Received, out received) || received < 0)
{
error.Visible = true;
lblError.Text = "Items received must not be lower than zero";
}
Related
I have a listview that tells the quantity ordered and quantity that has been delivered. I have complete added the first row, but the succeeding rows are not added. I want to add multiple records in one click. I have an add button outside the list view to do the job
Here is the list view of the form
<asp:ListView ID="lvPODetails" runat="server">
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lblProduct" runat="server" type="number" Text='<%# Eval("RefNo")%>' class="form-control" Visible ="false" />
<%# Eval("ProductName") %>
</td>
<td>
<%# Eval("Price", "{0: #,###.00}") %>
</td>
<td><asp:TextBox ID="txtOrdered" runat="server" type="number" Text='<%# Eval("DesiredQuantity") %>' readonly="true" class="form-control" /></td>
<td><asp:TextBox ID="txtQuantity" runat="server" type="number" min="1" max="1000000" Text='' class="form-control" required /></td>
<td><%# Eval("POAmount", "{0: #,###.00}") %></td>
<td><%# Eval("POAmount", "{0: #,###.00}") %></td>
</tr>
</ItemTemplate>
<EmptyDataTemplate>
<tr>
<td colspan="4"><h2 class="text-center">No records found.</h2></td>
</tr>
</EmptyDataTemplate>
</asp:ListView>
The .cs of the aspx
protected void btnAdd_Click(object sender, EventArgs e)
{
bool existingSupply = IsExisting();
foreach (ListViewItem item in lvPODetails.Items)
{
TextBox quantity = (TextBox)item.FindControl("txtQuantity");
Label ltr = (Label)item.FindControl("lblProduct");
TextBox odr = (TextBox)item.FindControl("txtOrdered");
string name = ltr.Text;
int delivered = Convert.ToInt32(quantity.Text);
int ordered = Convert.ToInt32(odr.Text);
string status = String.Empty;
if (delivered >= ordered)
{
status = "Complete";
}
if (delivered < ordered)
{
status = "Partially Completed";
}
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
if (existingSupply)
{
cmd.CommandText = "UPDATE Inventory SET Quantity=quantity + #Quantity WHERE ProductID=#ProductID";
}
else
{
cmd.CommandText = "INSERT INTO Inventory VALUES (#ProductID, #ProdCatID, #SupplierName, " +
"#Quantity, #CriticalLevel, #Price, #Status, #DateAdded, #DateModified)";
}
cmd.Parameters.AddWithValue("#ProductID", name);
cmd.Parameters.AddWithValue("#ProdCatID", DBNull.Value);
cmd.Parameters.AddWithValue("#SupplierName", txtSupplier.Text);
cmd.Parameters.AddWithValue("#Quantity", delivered);
cmd.Parameters.AddWithValue("#CriticalLevel", DBNull.Value);
cmd.Parameters.AddWithValue("#Price", DBNull.Value);
cmd.Parameters.AddWithValue("#Status", DBNull.Value);
cmd.Parameters.AddWithValue("#DateAdded", DateTime.Now);
cmd.Parameters.AddWithValue("#DateModified", DateTime.Now);
//cmd.CommandText = "UPDATE PurchaseOrder SET POStatus=#POStatus WHERE PONo=#PONo";
//cmd.Parameters.AddWithValue("#POStatus", status);
//cmd.Parameters.AddWithValue("#PONo", txtPONo.Text);
cmd.ExecuteNonQuery();
con.Close();
Response.Redirect("Default.aspx");
}
}
I don't get it, it is not showing errors but it is not adding the next rows.
Structure of my WebPage looks something like:
<asp:Repeter>
<asp:Repeter>
<asp:Repeter>
<asp:DataList>
<asp:Image />
</asp:DataList>
</asp:Repeter>
</asp:Repeter>
</asp:Repeter>
In the output of my Webform, I get all the images in the DataList control. But I want to display just 1st Image from each group.
Here is my code:
.aspx:
<asp:Repeater ID="ParentRepeater" runat="server">
<ItemTemplate>
<table>
<tr>
<td>
<asp:Image ID="imgMinimizeCategory" runat="server" ImageUrl="~/Images/Minimize.jpg" />
</td>
<td>
<asp:Label ID="lblCategory" runat="server" Text='<%# Eval("ProductName")%>' />
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Repeater ID="ChildRepeater" runat="server" DataSource='<%# Eval("Children") %>'>
<ItemTemplate>
<table>
<tr>
<td>
<asp:Image ID="imgMinimizeGroup" runat="server" ImageUrl="~/Images/Minimize.jpg" />
</td>
<td>
<asp:Label ID="lblGroup" runat="server" Text='<%# Eval("ProductName")%>' />
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Repeater ID="ChildrenRepeater" runat="server" DataSource='<%# Eval("Children") %>'>
<ItemTemplate>
<asp:DataList ID="dlProductImages" runat="server" DataSource='<%#Eval("Images") %>' DataKeyField="ImageId"
RepeatColumns="6">
<ItemTemplate>
<asp:Image ID="imageProductImage" runat="server" Height="180px" ImageUrl='<%# Eval("ImageUrl") %>' Width="180px" />
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
</asp:Repeater>
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MenuItem SelectedMenuItemInMaster = Session["SelectedMenuItem"] as MenuItem;
ParentRepeater.DataSource = GetProducts(SelectedMenuItemInMaster.Value);
ParentRepeater.DataBind();
}
}
private List<Product> GetProducts(string selectedValue)
{
List<Product> ProductsOfSelectedMenuItem = new List<Product>();
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
SqlConnection con = new SqlConnection(cs);
SqlDataAdapter da = new SqlDataAdapter("spGetMenuData", con);
DataSet ds = new DataSet();
da.Fill(ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr["ParentID"].ToString().Trim() == selectedValue)
{
Product item = new Product();
item.ProductName = dr["ProductName"].ToString();
item.ProductId = (int)dr["ProductId"];
item.ParentId = (int)dr["ParentId"];
foreach (DataRow drChild in ds.Tables[0].Rows)
{
if (drChild["ParentID"].ToString() == dr["ProductId"].ToString())
{
GetChildItems(ds, drChild, item);
}
}
ProductsOfSelectedMenuItem.Add(item);
}
}
SqlDataAdapter daImages = new SqlDataAdapter("Select * from Images", con);
DataSet dsImages = new DataSet();
daImages.Fill(dsImages);
foreach (Product p in ProductsOfSelectedMenuItem)
{
if (p.Children != null)
{
foreach (Product child in p.Children)
{
foreach (Product c in child.Children)
{
foreach (DataRow drImages in dsImages.Tables[0].Rows)
{
if (c.ProductId == (int)drImages["ProductId"])
{
if (c.Images == null)
{
c.Images = new List<Image>();
}
c.Images.Add(new Image() { ImageId = (int)drImages["ImageId"], ImageUrl = drImages["ImageUrl"].ToString(), ProductId = (int)drImages["ProductId"] });
}
}
}
}
}
}
return ProductsOfSelectedMenuItem;
}
private static void GetChildItems(DataSet ds, DataRow dr, Product item)
{
Product childItem = new Product();
childItem.ProductName = dr["ProductName"].ToString();
childItem.ProductId = (int)dr["ProductId"];
childItem.ParentId = (int)dr["ParentId"];
foreach (DataRow drChild in ds.Tables[0].Rows)
{
if (drChild["ParentID"].ToString() == dr["ProductId"].ToString())
{
GetChildItems(ds, drChild, childItem);
}
}
if (item.Children == null)
{
item.Children = new List<Product>();
}
item.Children.Add(childItem);
}
I know, you are thinking that this is a very silly question as I am adding all the images to the collection. But let me explain you. I will use all the images in my next programming step. So, I don't want a collection that does not get images. In short, I want all the images in the collection. When I declare DataSource='<%# Eval("Images")%>' in DataList Tag, I would like to query the collection here. But I don't know how.....
Update:
You can implement a method in code behind that you refer to in the DataSource attribute, and have the method return a subset of the images based on your needs.
DataSource='<%# MyFilteredImageCollection(Eval("Images")) %>'
I have 3 dropdown lists:
<tr>
<td align="left" class="style2">
Emp Code</td>
<td align="left">
<asp:UpdatePanel ID="UpdatePanel6" runat="server">
<ContentTemplate>
<div class="input-prepend" title="Select Machine ID" data-rel="tooltip">
<asp:DropDownList ID="ddcode" runat="server" AutoPostBack="True"
onselectedindexchanged="ddcode_SelectedIndexChanged">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ErrorMessage="RequiredFieldValidator" ControlToValidate="ddcode" ForeColor="Red">*
</asp:RequiredFieldValidator>
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr>
<tr>
<td align="left" class="style2">
Company</td>
<td align="left">
<asp:UpdatePanel ID="UpdatePanel3" runat="server">
<ContentTemplate>
<div class="input-prepend" title="Select Machine ID" data-rel="tooltip">
<asp:DropDownList ID="ddcompany" runat="server" AutoPostBack="True">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server"
ErrorMessage="RequiredFieldValidator" ControlToValidate="ddcompany" ForeColor="Red">*
</asp:RequiredFieldValidator>
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr>
<tr>
<td align="left" class="style2">
Branch</td>
<td align="left">
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<div class="input-prepend" title="Select Machine ID" data-rel="tooltip">
<asp:DropDownList ID="ddbranch" runat="server"
onselectedindexchanged="ddbranch_SelectedIndexChanged">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server"
ErrorMessage="RequiredFieldValidator" ControlToValidate="ddbranch" ForeColor="Red">*
</asp:RequiredFieldValidator>
</ContentTemplate> </asp:UpdatePanel>
</td>
</tr>
I also have a dropdown class:
public class Dropdown
{
Connection con = new Connection();
public void dropdwnlist(string qry, DropDownList ddl)
{
con.gettable(qry);
if (con.dt.Rows.Count > 0)
{
if (con.dt.Columns.Count == 2)
{
string str1 = con.dt.Columns[0].ColumnName.ToString();
string str2 = con.dt.Columns[1].ColumnName.ToString();
ddl.DataValueField = str1;
ddl.DataTextField = str2;
ddl.DataSource = con.dt;
ddl.DataBind();
con.dt.Columns.Remove(str1);
con.dt.Columns.Remove(str2);
}
else
{
string str = con.dt.Columns[0].ColumnName.ToString();
ddl.DataValueField = str;
ddl.DataTextField = str;
ddl.DataSource = con.dt;
ddl.DataBind();
con.dt.Columns.Remove(str);
//con.dt.Columns.Remove(str2);
}
}
ddl.Items.Insert(0, ("--Select--"));
}
My button click is:
Dropdown dwn = new Dropdown();
string str = "";
SqlDataReader dr;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
fillempcode();
//fillcompany();
//filldepartment();
}
}
protected void fillempcode()
{
string str = "select MachID,EmpCode from EmpDetails where StatusID='0'";
dwn.dropdwnlist(str, ddcode);
}
protected void fillcompany()
{
//Where EmpCode='" + ddcode.SelectedItem.Text + "'
str = "select CompanyID,CompanyName from Company ";
dwn.dropdwnlist(str, ddcompany);
str = "select CompanyID from View_Company where EmpCode='" + ddcode.SelectedItem.Text + "'";
dr=conn.query(str);
if (dr.Read())
{
string id = dr[0].ToString();
ddcompany.SelectedItem.Text = id;
}
}
protected void fillbranch()
{
//where EmpCode='" + ddcode.SelectedItem.Text + "'
string str = "select BranchID,BranchName from View_Branch";
dwn.dropdwnlist(str, ddbranch);
}
My problem is I want to enable all dropdownllist when I selected on EmpCode dropdown list. now it works fine but Company and Branch dropdown shows same value twise. may I know the reason?
Try rewriting the dropdwnlist method like this,
public void dropdwnlist(string qry, DropDownList ddl)
{
ddl.Items.Clear();
con.gettable(qry);
if (con.dt.Rows.Count > 0)
{
if (con.dt.Columns.Count == 2)
{
string str1 = con.dt.Columns[0].ColumnName.ToString();
string str2 = con.dt.Columns[1].ColumnName.ToString();
ddl.DataValueField = str1;
ddl.DataTextField = str2;
ddl.DataSource = con.dt;
ddl.DataBind();
con.dt.Columns.Remove(str1);
con.dt.Columns.Remove(str2);
}
else
{
string str = con.dt.Columns[0].ColumnName.ToString();
ddl.DataValueField = str;
ddl.DataTextField = str;
ddl.DataSource = con.dt;
ddl.DataBind();
con.dt.Columns.Remove(str);
//con.dt.Columns.Remove(str2);
}
}
ddl.Items.Insert(0, ("--Select--"));
ddl.SelectedIndex = 0;
}
Hope this helps...
I am using repeater control and showing paging '<< Previous next >>' it is working fine.
But i want to show links (rolling numbers) in between like below:
Previous << 1 2 3 4 5 next >>
have a look this picture for idea.
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table border="1" style="border-color: #336699;" cellspacing="0">
<tr style="background-color:#336699; color:White;">
<td>Product ID</td>
<td>Product Name</td>
<td>Unit Price</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("ProductID") %></td>
<td><%# Eval("ProductName") %></td>
<td><%# Eval("UnitPrice") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<div> <table width="500px" border="0" cellspacing="5" cellpadding="5">
<tr>
<td width="25%"> <asp:Label ID="Label2" runat="server" />
</td>
<td width="25%"><asp:HyperLink ID="linkPrev" runat="server">« Previous</asp:HyperLink>
</td>
<td width="25%"><asp:HyperLink ID="linkNext" runat="server">Next »</asp:HyperLink></td>
<td width="25%"><asp:Label ID="Label1" runat="server" /> </td>
</tr>
</table> </div>
c#
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
con.Open();
SqlCommand cmd = new SqlCommand("select * from Products", con);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
Repeater1.DataSource = ds;
Repeater1.DataBind();
con.Close();
DataTable table = new DataTable();
da.Fill(table);
PagedDataSource pds = new PagedDataSource();
pds.DataSource = table.DefaultView;
pds.AllowPaging = true;
pds.PageSize = 10;
int currentPage;
if (Request.QueryString["page"] != null)
{
currentPage = Int32.Parse(Request.QueryString["page"]);
}
else
{
currentPage = 1;
}
pds.CurrentPageIndex = currentPage - 1;
Label1.Text = "Page " + currentPage + " of " + pds.PageCount;
Label2.Text = "Results" + pds.DataSourceCount;
if (!pds.IsFirstPage)
{
linkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage - 1);
}
if (pds.IsFirstPage)
{
linkPrev.Visible = false;
linkPrev.Style["display"] = "block";
}
if (!pds.IsLastPage)
{
linkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage + 1);
}
if (pds.IsLastPage)
{
linkNext.Visible = false;
linkPrev.Style["display"] = "block";
}
Repeater1.DataSource = pds;
Repeater1.DataBind();
}
}
I have a Repeater which creates a table for multiple row with the same field name:
<asp:Repeater runat="server" ID="rptContent">
<HeaderTemplate>
<table border="0" style="width: 95%;">
<tr>
<td style="width: 25%;">Name</td>
<td style="width: 25%;">Last Four SSN #</td>
<td style="width: 25%;">PDF Generator</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("name").ToString() %></td>
<td><%# Eval("ssn3").ToString() %></td>
<td><asp:Button ID="btnGeneratePDF" runat="server" Text="Generate PDF For" onclick="btnGeneratePDF_Click" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
My code behind looks like this:
public void writeData()
{
Conn = new SqlConnection(cString);
Conn.Open();
nameE = txtName.Text;
var pdfPath = Path.Combine(Server.MapPath("~/PDFTemplates/9.pdf"));
// Get the form fields for this PDF and fill them in!
var formFieldMap = PDFHelper.GetFormFieldNames(pdfPath);
formFieldMap["topmostSubform[0].Page1[0].f1_01_0_[0]"] = txtName.Text;
sqlCode = "SELECT * FROM [db].[dbo].[TablePDFTest] WHERE [name] = '" + nameE + "'";
using (SqlCommand command = new SqlCommand(sqlCode, Conn))
{
command.CommandType = CommandType.Text;
using (reader = command.ExecuteReader())
{
if (reader.HasRows)
{
if (reader.Read())
{
formFieldMap["topmostSubform[0].Page1[0].f1_02_0_[0]"] = reader.GetValue(1).ToString();
formFieldMap["topmostSubform[0].Page1[0].f1_04_0_[0]"] = reader.GetValue(2).ToString();
formFieldMap["topmostSubform[0].Page1[0].f1_05_0_[0]"] = reader.GetValue(3).ToString();
formFieldMap["topmostSubform[0].Page1[0].f1_07_0_[0]"] = reader.GetValue(4).ToString();
formFieldMap["topmostSubform[0].Page1[0].social[0].TextField1[0]"] = reader.GetValue(5).ToString();
formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[0]"] = reader.GetValue(6).ToString();
formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[1]"] = reader.GetValue(7).ToString();
formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[2]"] = reader.GetValue(8).ToString();
formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[3]"] = reader.GetValue(9).ToString();
}
}
}
}
// Requester's name and address (hard-coded)
formFieldMap["topmostSubform[0].Page1[0].f1_06_0_[0]"] = "Medical Group\n2700 Wr Ave\nPurchase, NY 10232";
var pdfContents = PDFHelper.GeneratePDF(pdfPath, formFieldMap);
PDFHelper.ReturnPDF(pdfContents, "Compl.pdf");
}
How can I make it so if there are more than one entries each button will query by [name] where the last four ssn is different?
First, just a nod to using parameters...
Anyway, a lot of ways to do this, but one could be to add a commandargument value to your button (and then evaluate it in your code behind).
<asp:Button
ID="btnGeneratePDF"
runat="server"
Text="Generate PDF For"
CommandArgument = '<%# Eval("L4_SSN") %>'
onclick="btnGeneratePDF_Click" />
Then you'd need to make sure you had a field in your SELECT statement such as RIGHT(SSN,4) as L4_SSN
And finally, you'd modify your btnGeneratePDF_Click sub to evaluate e.CommandArgument...