Auto Serial Number With Custom GridView Pagination - c#

I am using custom pagination for the GridView along with Repeater. Here is the code that I've done so far:
Default.aspx:
<asp:Repeater ID="rptPager" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lnkPage" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>'
CssClass='<%# Convert.ToBoolean(Eval("Enabled")) ? "page_enabled" : "page_disabled" %>'
OnClick="lnkPage_Click" PostBackUrl='<%# "~/UI/SearchCity.aspx?page=" + Eval("Text") %>' OnClientClick='<%# !Convert.ToBoolean(Eval("Enabled")) ? "return false;" : "" %>'></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
Default.aspx.cs:
private void BindGridView(int pageIndex) //Bind data
{
List<Country> countryListView = null; //List type variable
countryListView = aManager.AllCountryList(); //Assigns the data in the list calling the method
totalRecordCount = countryListView.Count; //Counts total no. of record
pageSize = 4; //Page size
int startRow = pageIndex * pageSize; //Variable to assign the starting row
detailsGridView.DataSource = countryListView.Skip(startRow).Take(pageSize); //Shows data in GridView
detailsGridView.DataBind();
}
private void BindPager(int currentPageIndex) //Pagination
{
double getPageCount = (double)((decimal)totalRecordCount / (decimal)pageSize);
int pageCount = (int)Math.Ceiling(getPageCount); //Count page
List<ListItem> pages = new List<ListItem>(); //New list item
/****Pagination starts ****/
if (pageCount > 1)
{
pages.Add(new ListItem("<<", "1", currentPageIndex > 0));
for (int i = 1; i <= pageCount; i++)
{
pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPageIndex + 1));
}
pages.Add(new ListItem(">>", pageCount.ToString(), currentPageIndex < pageCount - 1));
}
/****Pagination ends ****/
rptPager.DataSource = pages;
rptPager.DataBind();
}
The above works perfect. But the issue is when I use the following to generate auto serial number, it does not work properly:
<%#(Container.DataItemIndex+1)%>
I mean when I browse to page 2, the row count begins from 1 and the same for other pages. Is there any way to resolve or any other efficient technique to handle this?

The Container.DataItemIndex is the index of the data item bound to the GridView and it can be used to determine the Row Index of the GridView Row. Therefore it is behaving as expected.
You have two choices:
1- Use your own rowcounter variable and store it in the session or viewpag objects.
2- better yet, let the database generate your row number instead. For example, if you are using Sql Server then do something like this:
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) ROW_NUM, * FROM MYTABLE

Here is the solution for the GridView custom pagination:
<asp:TemplateField HeaderText="Serial Number">
<ItemTemplate>
<%# (detailsGridView.PageIndex * detailsGridView.PageSize) + (Container.DataItemIndex + 1) %>
</ItemTemplate>
</asp:TemplateField>

This is best solution
<%# (Container.DataItemIndex + 1) %>

Related

System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values. Parameter name: index' in asp.net

Default.aspx
<Columns>
<asp:TemplateField HeaderText="Type">
<ItemTemplate>
<asp:DropDownList ID="typeHobby" runat="server">
<asp:ListItem style="display:none">--Select--</asp:ListItem>
<asp:ListItem Value="Sports">Sports</asp:ListItem>
<asp:ListItem Value="FineArt">Fine Arts</asp:ListItem>
<asp:ListItem Value="Other">Other</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:TextBox ID="nameSport" style="margin:2px" CssClass="cap" pattern="[A-Za-z]{2,15}" runat="server" ></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Details of participation">
<ItemTemplate>
<asp:TextBox ID="detailSport" style="margin:2px" CssClass="cap" pattern="[A-Za-z]{2,15}" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Distinction achieved">
<ItemTemplate>
<asp:TextBox ID="distSport" style="margin:2px" CssClass="cap" pattern="[A-Za-z]{2,15}" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Whether still intrested">
<ItemTemplate>
<asp:DropDownList ID="intrestSport" runat="server">
<asp:ListItem style="display:none">--Select--</asp:ListItem>
<asp:ListItem Value="yes">Yes</asp:ListItem>
<asp:ListItem Value="no">No</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="addHobby" runat="server" Text="Add" OnClick="ButtonAdd_Click_Hobby" CausesValidation="false" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Default.aspx.cs
protected void ButtonAdd_Click_Hobby(object sender, EventArgs e)
{
addHobby();
}
protected void addHobby()
{
// MessageBox.Show("add hobby");
try
{
int rowIndex = 0;
if (ViewState["HoobyTable"] != null)
{
MessageBox.Show("if true");
DataTable dtHobbyTable = (DataTable)ViewState["HoobyTable"];
DataRow drHobbyRow = null;
if (dtHobbyTable.Rows.Count > 0)
{
MessageBox.Show(dtHobbyTable.Rows.Count.ToString());
for (int i = 1; i <= dtHobbyTable.Rows.Count; i++)
{
//extract the TextBox values
MessageBox.Show("loop");
DropDownList txh1 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[1].FindControl("typeHobby");
TextBox txh2 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[2].FindControl("nameSport");
TextBox txh3 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[3].FindControl("detailSport");
TextBox txh4 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[4].FindControl("distSport");
DropDownList txh5 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[5].FindControl("intrestSport");
MessageBox.Show("Hello" + txh1.Text);
drHobbyRow = dtHobbyTable.NewRow();
drHobbyRow["Slno"] = i + 1;
dtHobbyTable.Rows[i - 1]["hoType"] = txh1.Text;
dtHobbyTable.Rows[i - 1]["Name"] = txh2.Text;
dtHobbyTable.Rows[i - 1]["Detail"] = txh3.Text;
dtHobbyTable.Rows[i - 1]["Distinction"] = txh4.Text;
dtHobbyTable.Rows[i - 1]["Interest"] ="interest";
rowIndex++;
}
dtHobbyTable.Rows.Add(drHobbyRow);
ViewState["HoobyTable"] = dtHobbyTable;
hobbyGrid.DataSource = dtHobbyTable;
hobbyGrid.DataBind();
}
}
else
{
Response.Write("ViewState is null");
}
}
catch (Exception e)
{
// MessageBox.Show(e.ToString());
}
//Set Previous Data on Postbacks
SetPreviousDataHobby();
}
private void SetPreviousDataHobby()
{
int rowIndex = 0;
if (ViewState["HoobyTable"] != null)
{
DataTable dt = (DataTable)ViewState["HoobyTable"];
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
DropDownList txh1 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[1].FindControl("typeHobby");
TextBox txh2 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[2].FindControl("nameSport");
TextBox txh3 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[3].FindControl("detailSport");
TextBox txh4 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[4].FindControl("distSport");
DropDownList txh5 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[5].FindControl("intrestSport");
MessageBox.Show("type hobby" + dt.Rows[i]["hoType"].ToString());
txh1.Text = dt.Rows[i]["hoType"].ToString();
txh2.Text = dt.Rows[i]["Name"].ToString();
txh3.Text = dt.Rows[i]["Detail"].ToString();
txh4.Text = dt.Rows[i]["Distinction"].ToString();
txh5.Text = dt.Rows[i]["Interest"].ToString();
rowIndex++;
}
}
}
}
System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values.
Parameter name: index'
-> got an error like above in line:
DropDownList txh5 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[5].FindControl("intrestSport");
(line from SetPreviousDataHobby() function)
I believe this should point you in the right direction
Rows and Columns of DataGrid starts at index 0
hobbyGrid.Rows[rowIndex].Cells[5] indicates that there are 6 columns, do you think that's true ?
The error message simply indicates that you are accessing an index that is outside the limits of the data structure.
You can validate how many columns are available at row[0] by hobbyGrid.Rows[0].Cells.Count-1; Cells[5] should not exceed this
OR
You can also check number of colums from table like int cols= dtHobbyTable.Columns.Count
Error is because, you are accessing cells from 1 through 5. so at Cells[5] its throwing out of range exception. Please modify your code to start from 0:
DropDownList txh1 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[0].FindControl("typeHobby");
TextBox txh2 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[1].FindControl("nameSport");
TextBox txh3 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[2].FindControl("detailSport");
TextBox txh4 = (TextBox)hobbyGrid.Rows[rowIndex].Cells[3].FindControl("distSport");
DropDownList txh5 = (DropDownList)hobbyGrid.Rows[rowIndex].Cells[4].FindControl("intrestSport");
Side but related notes:
1) There is another issue that you may encounter after fixing this error:
adding data row outside forloop. So, you are basically overwriting data row in for loop and adding just one row. Ignore me if that is what you expected. Otherwise, move the below line inside for loop.
dtHobbyTable.Rows.Add(drHobbyRow);
2) Another issue is you are running for loop on an item which you are updating. Instead its good to have for loop on hobbyGrid.Rows.Count.

Textboxes Causing Problems in ASP.NET C# SQL

I am using a nested Gridview(I have 5 Nested Gridviews).
I have applied a Regular Field validator for these Gridviews.
But once I click the button, commas are generated in the textbox. Due to that whenever I click the button, all the validation get fired.
I have researched lots of articles but have not found one related to this.
Here is the image for the Gridview with the commas generated in the textbox:
HTML Code Part
<%-- First Gridview--%>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
CssClass="gvstyling gridview_width_60" ShowHeaderWhenEmpty="true" EmptyDataText="Record(s) Not Found!"
DataKeyNames="locality" ShowHeader="false" OnRowDataBound="gvLocality_RowDataBound">
<Columns>
<asp:TemplateField ItemStyle-Width="15px">
<ItemTemplate>
<img alt="" style="cursor: pointer" src="../images/plus.png" />
<asp:Panel ID="pnlCompanyName" runat="server" Style="display: none">
<%-- Second Gridview --%>
<asp:GridView ID="gvCompanyName" ShowHeader="false" ShowHeaderWhenEmpty="false" CssClass="gvstyling gridview_width_100"
OnRowDataBound="gvCompanyName_RowDataBound" runat="server"
AutoGenerateColumns="false" EmptyDataText="No Record(s) Found!">
<Columns>
<asp:TemplateField ItemStyle-Width="15px">
<ItemTemplate>
<asp:HiddenField ID="hfRetailer_Id" Value='<%# Eval("retailer_id") %>' runat="server"></asp:HiddenField>
<asp:HiddenField ID="hfLocality" Value='<%# Eval("locality") %>' runat="server"></asp:HiddenField>
<asp:Label ID="lbl" Visible="false" Text='<%# Eval("retailer_id") %>' runat="server"></asp:Label>
<img alt="" style="cursor: pointer" src="../images/plus.png" />
<asp:Panel ID="pnlSellOrderNo" runat="server" Style="display: none">
<%-- Third Gridview --%>
<asp:GridView ID="gvSellOrderNo" ShowHeader="false" ShowHeaderWhenEmpty="false"
CssClass="gvstyling gridview_width_100" runat="server" OnRowDataBound="gvSellOrderNo_RowDataBound"
AutoGenerateColumns="false" EmptyDataText="No Record(s) Found!">
<Columns>
<asp:TemplateField ItemStyle-Width="15px">
<ItemTemplate>
<asp:HiddenField ID="hf_SellOrderNo" Value='<%# Eval("sell_order_no") %>' runat="server"></asp:HiddenField>
<asp:Label ID="lblSellOrderNo" Visible="false" Text='<%# Eval("sell_order_no") %>' runat="server"></asp:Label>
<img alt="" style="cursor: pointer" src="../images/plus.png" />
<asp:Panel ID="pnlProductDetails" runat="server" Style="display: none">
<%-- fourth Gridview --%>
<asp:GridView ID="gvProductDetails" ShowHeader="false" ShowHeaderWhenEmpty="false"
CssClass="gvstyling gridview_width_100" runat="server" OnRowDataBound="gvProductDetails_RowDataBound"
AutoGenerateColumns="false" EmptyDataText="No Record(s) Found!">
<Columns>
<asp:TemplateField ItemStyle-Width="15px">
<ItemTemplate>
<asp:HiddenField ID="HiddenField1" Value='<%# Eval("sell_order_no") %>' runat="server"></asp:HiddenField>
<asp:HiddenField ID="hfProductId" Value='<%# Eval("product_id") %>' runat="server"></asp:HiddenField>
<asp:Label ID="lblProductId" Visible="false" Text='<%# Eval("product_id") %>' runat="server"></asp:Label>
<img alt="" style="cursor: pointer" src="../images/plus.png" />
<asp:Panel ID="pnlWarehouseDetails" runat="server" Style="display: none">
<%-- fifth Gridview--%>
<asp:GridView ID="gvWarehouseDetails" ShowHeader="false" ShowHeaderWhenEmpty="false"
CssClass="gvstyling gridview_width_100" runat="server"
AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lblWarehouseId" Text='<%# Eval("c_warehouse_id") %>' Visible="false" runat="server"></asp:Label>
<%# Eval("warehouse_name") %> (<%# Eval("qty") %>)
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="txtQty" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<%-- fifth Gridview --%>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<%# Eval("product_name") %> (<%# Eval("qty") %>)
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<%-- fourth Gridview --%>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<%# Eval("sell_order_no") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<%-- Third Gridview --%>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Business Name">
<ItemTemplate>
<%# Eval("business_name") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<%-- Second Gridview--%>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-CssClass="gv_item_bg">
<ItemTemplate>
<asp:Label ID="lblLocality" runat="server" Text=' <%# Eval("locality") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<%-- First Gridview --%>
Code Behind File
//Filling Shipping Company Name
private void FillShippingCompanyName()
{
try
{
ArrayList arr = new ArrayList();
cm.ds.Clear();
cm.sp_dataset_execute("spdisplay_Shipping_Comany_Name", arr);
ddlCompanyName.DataSource = cm.ds;
ddlCompanyName.DataValueField = "shipping_code";
ddlCompanyName.DataTextField = "shipping_name";
ddlCompanyName.DataBind();
ddlCompanyName.Items.Insert(0, new ListItem("---- Select Shipping Company ----", "0"));
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-FillShippingCompanyName()");
}
finally
{
cm.con.Close();
}
}
private void FillLocality()
{
try
{
cm.ds.Clear();
ArrayList arr = new ArrayList();
cm.sp_dataset_execute("spDisplay_Locality", arr);
gvLocality.DataSource = cm.ds;
gvLocality.DataBind();
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-FillLocality()");
cm.con.Close();
}
finally
{
cm.con.Close();
}
}
//Locality Gridview Row Databound (Level 1 Grdview)
common cm1 = new common();
protected void gvLocality_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string Locality = gvLocality.DataKeys[e.Row.RowIndex].Value.ToString();
GridView gvCompanyName = e.Row.FindControl("gvCompanyName") as GridView;
cm1.ds.Clear();
//Binding Company Gridview
ArrayList arr1 = new ArrayList();
arr1.Add("#locality|" + Locality + "");
cm1.sp_dataset_execute("spDisplayCompanyName", arr1);
gvCompanyName.DataSource = cm1.ds;
gvCompanyName.DataBind();
}
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Recent_activity-gvRecentActivityOuter_RowDataBound()");
cm1.con.Close();
}
finally
{
cm1.con.Close();
}
}
//Comapny Name Gridview Row Databound (Level 2 Grdview)
common cm2 = new common();
protected void gvCompanyName_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string RetailerId = ((HiddenField)e.Row.FindControl("hfRetailer_Id")).Value;
GridView gvSellOrderNo = e.Row.FindControl("gvSellOrderNo") as GridView;
string Locality = ((HiddenField)e.Row.FindControl("hfLocality")).Value;
cm2.ds.Clear();
//Binding Company Gridview
ArrayList arr = new ArrayList();
arr.Add("#retailer_id|" + RetailerId + "");
arr.Add("#locality|" + Locality + "");
cm2.sp_dataset_execute("spDisplay_SellOrderNo", arr);
gvSellOrderNo.DataSource = cm2.ds;
gvSellOrderNo.DataBind();
}
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-Page_Load()");
cm2.con.Close();
}
finally
{
cm2.con.Close();
}
}
//Sell Order Gridview Row Databound (Level 3 Grdview)
common cm3 = new common();
protected void gvSellOrderNo_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string SellOrderNo = ((HiddenField)e.Row.FindControl("hf_SellOrderNo")).Value;
GridView gvProductDetails = e.Row.FindControl("gvProductDetails") as GridView;
FillProductDetails(gvProductDetails, SellOrderNo);
}
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-gvSellOrderNo_RowDataBound()");
cm3.con.Close();
}
finally
{
cm3.con.Close();
}
}
private void FillProductDetails(GridView gvProductDetails, string SellOrderNo)
{
cm3.ds.Clear();
//Product Details Gridview
ArrayList arr = new ArrayList();
arr.Add("#sell_order_no|" + SellOrderNo + "");
cm3.sp_dataset_execute("spDisplay_ProductDetails", arr);
gvProductDetails.DataSource = cm3.ds;
gvProductDetails.DataBind();
}
//Product Details Gridview Row Databound (Level 4 Grdview)
common cm4 = new common();
protected void gvProductDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string ProductID = ((HiddenField)e.Row.FindControl("hfProductId")).Value;
string SellOrderNo = ((HiddenField)e.Row.FindControl("HiddenField1")).Value;
GridView gvWarehouseDetails = e.Row.FindControl("gvWarehouseDetails") as GridView;
cm4.ds.Clear();
//Product Details Gridview
ArrayList arr = new ArrayList();
arr.Add("#product_id|" + ProductID + "");
arr.Add("#sell_order_no|" + SellOrderNo + "");
cm4.sp_dataset_execute("spDisplay_WarehouseDetails", arr);
gvWarehouseDetails.DataSource = cm4.ds;
gvWarehouseDetails.DataBind();
}
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-gvProductDetails_RowDataBound()");
cm4.con.Close();
}
finally
{
cm4.con.Close();
}
}
//Submit Button
protected void btnSubmit_Click1(object sender, EventArgs e)
{
try
{
cm.ds.Clear();
//--Insert Query for Rs_Shipping_Order_Details
string ShippingCode = "SHO" + DateTime.Now.ToString("yyyyMMddHHmmss");
string ShippingGroup = "SG" + DateTime.Now.ToString("yyyyMMddHHmmss");
ArrayList arr = new ArrayList();
arr.Add("#shipping_code|" + ShippingCode + "");
arr.Add("#shipping_Company_code|" + ddlCompanyName.SelectedValue + "");
arr.Add("#is_shipping_delivered|0");
cm.sp_execute("spInsert_Shipping_Order_Detail", arr);
//Locality for loop
for (int i = 0; i < gvLocality.Rows.Count; i++)
{
GridView gvCompanyName = gvLocality.Rows[i].FindControl("gvCompanyName") as GridView;
//Company for loop
for (int j = 0; j < gvCompanyName.Rows.Count; j++)
{
GridView gvSellOrderNo = gvCompanyName.Rows[j].FindControl("gvSellOrderNo") as GridView;
string RetailerId = ((Label)gvCompanyName.Rows[j].FindControl("lbl")).Text;
//Sell Order for loop
for (int k = 0; k < gvSellOrderNo.Rows.Count; k++)
{
//Product Details Gridview
GridView gvProductDetails = gvSellOrderNo.Rows[k].FindControl("gvProductDetails") as GridView;
string SO = ((Label)gvSellOrderNo.Rows[k].FindControl("lblSellOrderNo")).Text;
int retailer_Id = Convert.ToInt32(RetailerId);
//Product Details for loop
for (int l = 0; l < gvProductDetails.Rows.Count; l++)
{
//Warehouse Details Gridview
GridView gvWarehouseDetails = gvProductDetails.Rows[l].FindControl("gvWarehouseDetails") as GridView;
string ProductId = ((Label)gvProductDetails.Rows[l].FindControl("lblProductId")).Text;
//Warehouse Details for loop
for (int m = 0; m < gvWarehouseDetails.Rows.Count; m++)
{
TextBox txtQty = gvWarehouseDetails.Rows[m].FindControl("txtQty") as TextBox;
string LastValue = txtQty.Text.Split(',').Last();
if (String.IsNullOrEmpty(LastValue) == false)
{
string Warehouse_Id = ((Label)gvWarehouseDetails.Rows[m].FindControl("lblWarehouseId")).Text;
int warehouse_id = Convert.ToInt32(Warehouse_Id);
string Qty = LastValue;
//Insert Query for Rs_Shipping_Detail_Mapping
ArrayList arr1 = new ArrayList();
arr1.Add("#shipping_order_code|" + ShippingCode + "");
arr1.Add("#retailer_id|" + retailer_Id + "");
arr1.Add("#sell_order_no|" + SO + "");
arr1.Add("#product_id|" + ProductId + "");
arr1.Add("#c_warehouse_id|" + warehouse_id + "");
arr1.Add("#shipping_group|" + ShippingGroup + "");
arr1.Add("#qty|" + Qty + "");
common cm1 = new common();
cm1.sp_execute("spInsert_Shipping_Detail_Mapping", arr1);
////Generating Pdf for Each Sell Order
//if (m == gvWarehouseDetails.Rows.Count - 1)
//{
// Generate_SellOrderWise_PDf(SO, ShippingCode, ShippingGroup);
//}
}
}
}
}
}
}
Response.Redirect("../final-shipping-order/?SG=" + ShippingGroup, false);
}
catch (Exception ex)
{
ErrHandler.WriteError(ex.Message.ToString(), "Shipping-Order-btnSubmit_Click1()");
cm4.con.Close();
}
finally
{
cm4.con.Close();
}
}
Question :
1. How do I remove the commas from the textboxes?
2. Reason for these commas? (Why are the commas being generated on the button click?)
3. Limit for the Nested Gridview ?
Any help will be appreciated.
When you have duplicate form field names, the values are concatenated together with commas.
So, for example, if you have the following..
<input type="text" name="name" value="">
<input type="text" name="name" value="">
.. your resulting value on Request.Form postback looks like this:
name=,,
That's what's happening.
Here are a few possible solutions to your problem, though I have not tested any of them :)
1) UpdatePanel
From reading, it seems that if you create an UpdatePanel for the offending grid control (<asp:TextBox ID="txtQty" runat="server"></asp:TextBox>) , it removes this problem. Again, I have not tested this
2) Changing DataBind() behavior during Page_Load()
So...
page_load()
{
if(!isPostBack())
{
// DataBind normally
myGridview.DataBind();
}
else
{
//Some intelligent way to remove commas before binding
}
}
... But that doesn't change the fact that the ,,,values are being posted in the first place. And so, if your primarily concerned with the end aesthetic and not behavior, you can just use JS to strip out the commas (as previously suggested hinted at.)
3) JS - Get Rid of the Commas:
(as suggested here)
<script type="text/javascript">
$("[src*=plus]").live("click", function () {
$(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>")
$(this).attr("src", "images/minus.png");
$("input", $(this).closest("tr").next()).each(function () {
this.value = this.value.substring(',', '');
});
});
$("[src*=minus]").live("click", function () {
$(this).attr("src", "images/plus.png");
$(this).closest("tr").next().remove();
});
</script>
Hope this helps :)
[Edit] - Validation
I would fire off validation using the .keydown() event. In your case, it might look something like this:
// Bind to each input with id='txtQty', in each row, in the "gridview" with id='gvWarehouseDetails'
$("#gvWarehouseDetails tr input[id*='txtQty']").each(function () {
$(this).keydown(function (event) { // <-- specifies the specific input
// Validation logic goes here...
});
});
The Ajax Control Toolkit is a viable solution, however support for it has become non-existent. I'm assuming there is a level of dynamic control on that field. In essence, the grid will display it at certain instances?
Either way, you could add a specific class to the field:
<asp:Textbox id="txtContent" runat="server" CssClass="Validator">
Essentially when the grid adds all of these fields to your page, they'll all have the Validator class. So you can write JavaScript to actually strip the character out of the field, example:
$('.Validator').on('blur', function() {
$(this).replace(',', '');
});
As soon as the focus changes, that field will remove the , from the field as soon as the mouse leaves the , will be removed from the field.
That is one approach, countless other options do exist as well to accomplish this. This solution is pretty easy, agile, and light so it should be adequate.
Update:
The solution I chose shouldn't require a loop over those fields. Simply because blur triggers whenever a change or focus is lost on that field. Since you mentioned the , appears when the user clicks in the field. Otherwise you could do validation on all the fields. All you simply would need to do:
$('.Validator').each(function() {
// Will iterate through each field.
});
So you could essentially use JavaScript yourself to validate those fields, or use a simple library such as Valid8 which will do all client-side validation. No postback, all done client side before sent to the server to process.
Avoid:
Update Panel - These are quite a pain and incredibly inefficient. The way they work basically is by taking your entire page and storing it memory then does an Ajax request and refreshes your page and pulls all the contents out of memory to place on the page. Additionally it makes working with the Asp.Net Page Life Cycle incredibly difficult.
Hardik, how is txtQty.Text bound at first?
Does it come as an empty text box?
You using the code string LastValue = txtQty.Text.Split(',').Last(); to try go get rid of this comma values inserted or the values bound come with commas? I mean, you using the same UI culture from values in the database and the app or do you have to format it before displaying it?
I Don't know what is happening in your code. But If you want to get rid of Comma (',') then I should suggest one thing to you.
Add a reference of AjaxControlToolKit and register it in your aspx page as shown below:
<%# Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit, Version=[VersionNumber], Culture=neutral, PublicKeyToken=[TokenNumber]" %>
Or You can refer How to install AJAX Control toolkit
Once you have installed AJAX Control Toolkit, Go to your page and in your grid TemplateField, below TextBox txtQty, add FilteredTextBoxExtender as shown below:
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="txtQty" runat="server"></asp:TextBox>
<ajaxToolkit:FilteredTextBoxExtender runat="server" InvalidChars="," FilterMode="InvalidChars" TargetControlID="txtQty" />
</ItemTemplate>
</asp:TemplateField>
By Adding FilterTextBoxExtender, It will not allow characters to be inserted which are mentioned as InvalidChars to the textbox 'txtQty'.

Grid view row command is firing after every second click

I've shopping cart in grid view. The grid is in update panel with update mode always. The grid view is itself in a user control and this user control renders in a child page (GridView --> User Control --> Child aspx page --> master page). Whenever I click on any button to modify cart the gridview row command not fires first time but when I again click on the button second time the row command fires correctly. Now I don't know why the row command event is not firing on first click and it is firing only on every even click (second click).
ASP:
<asp:GridView ID="GVCart" runat="server" AutoGenerateColumns="False" OnRowCommand="CartUpdate">
<Columns>
<asp:BoundField DataField="Product_Name" HeaderText="Product Name">
</asp:BoundField>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="Button3" runat="server" CommandArgument='<%# Eval("Product_ID") %>'
CommandName="DecreseCartQty" Height="20px" ToolTip="Minus" AlternateText="+" />
<asp:ImageButton ID="ImageButton1" runat="server" CommandArgument='<%# Eval("Product_ID") %>'
CommandName="IncreaseCartQty" Height="20px" ToolTip="Add" AlternateText="-" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="ABC" runat="server" Text='<%# Eval("ItemQTY")+" * "+Eval("Price")+" = "+Eval("TotalPrice") %> '></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="Button4" runat="server" CommandArgument='<%# Eval("Product_ID") %>' CommandName="Remove" ToolTip="Cancel"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
C#: (in user control)
protected void CartUpdate(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "IncreaseCartQty")
{
int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
DataTable CartDT = (DataTable)Session["cart"];
for (int i = 0; i < CartDT.Rows.Count; i++)
{
if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
{
CartDT.Rows[i]["ItemQTY"] = Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) + 1;
CartDT.Rows[i]["TotalPrice"] = Convert.ToInt32(CartDT.Rows[i]["Price"]) * Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]);
//Page.Response.Redirect(Page.Request.Url.ToString(), true);
}
}
}
if (e.CommandName == "DecreseCartQty")
{
int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
DataTable CartDT = (DataTable)Session["cart"];
for (int i = 0; i < CartDT.Rows.Count; i++)
{
if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
{
if (Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) > 1)
{
CartDT.Rows[i]["ItemQTY"] = Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) - 1;
CartDT.Rows[i]["TotalPrice"] = Convert.ToInt32(CartDT.Rows[i]["Price"]) * Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]);
// Page.Response.Redirect(Page.Request.Url.ToString(), true);
}
}
}
}
if (e.CommandName == "Remove")
{
int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
DataTable CartDT = (DataTable)Session["cart"];
for (int i = 0; i < CartDT.Rows.Count; i++)
{
if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
{
CartDT.Rows.RemoveAt(i);
//Page.Response.Redirect(Page.Request.Url.ToString(), true);
}
}
}
}
Can anyone tell me what wrong I am doing. Your answer will be great help for me.
Thanks in advance.
It is behaving properly. You should rebind the gridview after CartUpdate so that another post back is not required.
just add these lines after
if (e.CommandName == "Remove")
{
int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
DataTable CartDT = (DataTable)Session["cart"];
for (int i = 0; i < CartDT.Rows.Count; i++)
{
if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
{
CartDT.Rows.RemoveAt(i);
//Page.Response.Redirect(Page.Request.Url.ToString(), true);
}
}
}
DataTable CartDT = (DataTable)Session["cart"];
gridview1.datasource=CartDT ;
gridview1.databind();
Checkout this answer, I think it will solve your problem. If you have your grid view in user control this issue can arise. I had a same issue when I had my grid view in a user control.

how to count number of checkboxes(across all pages of gridview) checked in gridview using javascript

I am in a situation where in need help from you.
i have written below code in javascript which checks how many checkboxes are checked in gridview and display message however its restricted to one page of my gridview only and doesnt work when i move to next page, is there any way that javascript code check how many checkboxes have been checked across all pages of gridview ?
function CheckBoxCount()
{
var gv = document.getElementById("<%= Gridview1.ClientID %>");
var inputList = gv.getElementsByTagName("input");
var numChecked = 0;
for (var i = 0; i < inputList.length; i++)
{
if (inputList[i].type == "checkbox" && inputList[i].checked)
{
numChecked = numChecked + 1;
if( numChecked > 8)
{
alert('Only Eight items could be added in final grid');
break;
}
}
}
}
alert($('input[name=checkbox_name]').attr('checked'));
or
alert($("input:checkbox:checked").length);
if they didnt work check this : calculate the number of html checkbox checked using jquery
*** dont forget to add Jquery.min.js in your markup
Try the bellow code:
Javascript:
function gvCheckBoxClick(currentCheck) {
var input = document.getElementById("<%=gvRuleList.ClientID %>");
var chekRowCount = document.getElementById("<%=chkRowCount.ClientID %>").value;
if (currentCheck.type == "checkbox") {
if (currentCheck.checked == true) {
chekRowCount++;
}
else {
chekRowCount--;
}
}
}
Gridview:
<Columns>
<asp:TemplateField HeaderText="<%$ Resources:Opm_RuleList_ListHeader_Select %>">
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" onclick="javascript:gvCheckBoxClick(this);"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
use hidden variable
<input type="hidden" id="chkRowCount" name="chkRowCount" runat ="server" value="0" />

Adding a drop down in itemtemplate and populating value dynamically

I have an item template in a GridView and I want to create a dropdown for each row and bind it to a value retrieved from the database.. but I am not sure how to do this.. this is what i have so far.. but not sure where to put the code to populate the drop down per row..
<ItemTemplate>
<asp:DropDownList runat="server" ID="ddlMyQuantity" SelectedValue='<%#
(DataBinder.Eval(Container.DataItem,"Quantity")) %>'>
</asp:DropDownList>
</ItemTemplate>
and in code behind, not sure how to or where to put this so that it is created on every row..
public void BindMyQuantity()
{
for (int i = 1; i < 15; i++)
{
ddlMyQuantity.Items.Add(i.ToString());
}
}
Also i am not sure if i can do that, but the code is not complaining.. adding SelectedValue in the asp declaration
You can use OnRowDataBound to dynamically bind your dropdown:
protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType == DataControlRowType.DataRow)
{
var dropdownList = (DropDownList)e.Row.FindControl("ddlMyQuantity");
for (int i = 1; i < 15; i++)
{
dropdownList.Items.Add(i.ToString());
}
dropdownList.SelectedValue =
Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Quantity"));
}
}
Add binding:
<asp:GridView ... OnRowDataBound="GridView_RowDataBound">
...
</asp:GridView>
As per my knowledge, the best option would be to write this code in "RowDataBound" event of the Grid. See sample code below.
protected void GridView_RowDataBound(..)
{
if (e.Row.RowType.Equals(DataControlRowType.DataRow))
{
DropDownList ddl = e.Row.FindControl("ddlMyQuantity") as DropDownList;
if (ddl != null)
{
for (int i = 1; i < 15; i++)
{
ddl.Items.Add(i.ToString());
}
}
}
}
In the aspx page, provide this
<ItemTemplate>
<asp:DropDownList runat="server" ID="ddlMyQuantity"></asp:DropDownList>
</ItemTemplate>
Hope this Helps!!
<asp:TemplateField HeaderText="Type Cargo" HeaderStyle-HorizontalAlign="Center" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataValueField="DESCRIPTION"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
Code Behind will look like this...
Dim rowId As DropDownList
For i As Integer = 0 To gridView1.Rows.Count - 1
Dim gridrow As GridViewRow = gridView1.Rows(i)
rowId = DirectCast(gridrow.FindControl("DropDownList1"), DropDownList)
Dim dt As DataTable = Get_List()
rowId.DataSource = dt
rowId.DataBind()
Next
Get_List is a Function that returns a DataTable

Categories