Editing function for an XML Gridview in ASP.NET - asp.net

I want to write, update or edit a function for an XML gridview in ASP.net (in visual studio 2010), but I don't know which action I should use?
This is my code but it doesn't work. When I click edit on the gridview an exception occured:
private DataSet ds;
DataRow r;
protected void Page_Load(object sender, EventArgs e)
{
ds = new DataSet();
ds.ReadXml(Server.MapPath("../web.config"));
GridView1.DataSource = ds.Tables["user"];
GridView1.DataBind();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridView1.EditIndex = e.RowIndex;
GridView1.DataBind();
}
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
r = ds.Tables["user"].Rows[e.AffectedRows];
r["password"] = FormsAuthentication.HashPasswordForStoringInConfigFile(GridView1.SelectedRow.Cells[1].ToString(), "MD5");
ds.AcceptChanges();
ds.WriteXml(Server.MapPath("web.config"));
GridView1.DataBind();
}
thanks

I may have got this wrong but are you trying to amend the web.config file by loading into a gridview? I don't think you can do things like that with web.config - so it's probably to be expected that it's throwing erorrs.
For amending the web.config at runtime have you considered using WebConfigurationManager. The object is built with this in mind. Although the previous link says ASP.Net 2.0 and 3.5 it would be fine in 4.0 (Visual Studio 2010). This SO Question gives a very clear code sample.

Related

Order gridview with linq data in asp

I am using EF6 with Linq and i am trying to order data from my Oracle database with the FileID.
This is my code to populate the data.
protected void Page_Load(object sender, EventArgs e)
{
this.Form.Enctype = "multipart/form-data"; //this is required for multi uploading
if (!IsPostBack)
{
PopulateUploadedFiles();
}
}
private void PopulateUploadedFiles()
{
//Populate data
using(Mox_Database_Entities dc = new Mox_Database_Entities())
{
GridView1.DataSource = dc.FILE_UPLOADING.ToList();
GridView1.DataBind();
}
}
I want an ascending order for this gridview. Allowsorting = true in my gridview. I tried multiple ways to get this right but it still doesn't work.
Does anyone had this problem before?
thanks in advance for the effort.

using selectcommand on code behind with gridview

I have a sqldatascource that I need to pass null values to it and then use the selectcommand specified by a stored procedure and then using the result query to populate a gridview on the page load
notes: I tried the stored procedure on sql server managment studio and its working fine
I alread specified sqldatascource on for gridview1 in the page design view
I tried this code but the gridview still shows empty
protected void Page_Load(object sender, EventArgs e)
{
SqlDataSource1.SelectParameters["location"].DefaultValue = null;
SqlDataSource1.SelectParameters["time"].DefaultValue = null;
SqlDataSource1.SelectParameters["date"].DefaultValue = null;
SqlDataSource1.DataBind();
GridView1.DataBind();
}
I think using null does not represent a database NULL.
This might work
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
SqlDataSource1.SelectParameters["location"].DefaultValue = System.DbNull.Value;
SqlDataSource1.SelectParameters["time"].DefaultValue = System.DbNull.Value;
SqlDataSource1.SelectParameters["date"].DefaultValue = System.DbNull.Value;
SqlDataSource1.DataBind();
GridView1.DataBind();
}
}

When to fill a sorted asp:GridView?

i've tried to ask this question a number of ways. It's a difficult question to answer because you have to understand what's going on.
When do i fill a GridView?
The nieve answer is during Page_Load, if not a PostBack:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataSet ds = GetStuffToShow();
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
The problem with that is that if it is a postback, the grid is not filled. The reason the grid is not filled is because we've turned off the viewstate of the grid.
So don't look at IsPostBack
We need to always fill the grid, postback or not:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = GetStuffToShow();
GridView1.DataSource = ds;
GridView1.DataBind();
}
The problem with that is that if the user sorts a column, the OnSorting event is called after both Page_Init and Page_Load:
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataSet ds = GetStuffToShow(e.SortExpression, e.SortDirection);
GridView1.DataSource = ds;
GridView1.DataBind();
}
we've run two database queries, when only one was required.
Cache is fine for column sorting
If i'm willing to accept invalid cache during column sorting, i can store the DataSet in the session variable, as long as i invalidate it for any other operation.
The problem is the OnSorting event is called after i need it (Page_Load):
protected void Page_Load(object sender, EventArgs e)
{
if (AGridViewOnSortingEventIsntBeingRaised)
{
DataSet ds = GetStuffToShow();
StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataSet ds = GetDataSetOutOfSessionSomehowThatDamnWellBetterBeThere();
SomehowSortAReadOnlyDisconnectedDataSet(ds, e.SortExpression, e.SortDirection);
GridView1.DataSource = ds;
GridView1.DataBind();
}
Fear of the unknown
Then there's still the terror i have because i turned off viewstate of the GridView. i don't think that a read-only asp:GridView should need tens of kilobytes base64 encoded, when i can just rebuild it from the server (or from memory).
But i believe that i am obligated to return the GridView to the state it was in the last time the page was rendered. And i have to do it before Page_Load (i.e. during Page_Init). i have this fear because someone said so. So i turn it into
protected void Page_Init(object sender, EventArgs e)
{
if (AGridViewOnSortingEventIsntBeingRaised)
{
DataSet ds = GetStuffToShow();
StoreTheDatasetInTheSessionSomehowInCaseTheyCallSortInTheFuture(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
The problem with this is that GetStuffToShow depends on things the user has typed into text boxes, which don't exist during Page_Init
Anyway, i'm rambling. It's too hot in here. Hopefully this question will be answered, unlike my other recent frustrations with asp.net
Bonus Reading
Sorting GridView Formed With Data Set
By adding a couple of hidden fields, one for the sort expression, and the other for the sort direction you can use those values to populate the GridView once at page load and then update the sorting in the Sorting event (sort code modified from the All-In-One Code Framework GridView sample):
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = GetStuffToShow();
GridView1.DataSource = ds;
GridView1.DataBind();
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
// If the sorting column is the same as the previous one,
// then change the sort order.
if (SortExpression.Value.Equals(e.SortExpression))
{
SortDirection.Value = SortDirection.Value.Equals("ASC") ? "DESC" : "ASC";
}
// If sorting column is another column,
// then specify the sort order to "Ascending".
else
{
SortExpression.Value = e.SortExpression;
SortDirection.Value = "ASC";
}
var sortedView = new DataView(<convert your DataSet to a DataTable>)
{ Sort = string.Format("{0} {1}", this.SortExpression.Value, this.SortDirection.Value) };
GridView1.DataSource = sortedView;
GridView1.DataBind();
}
Note that SortDirection and SortExpression are the hidden fields. This also lends itself well to caching the DataSet.
Also, I wouldn't be concerned about the Page_Init issue that you brought up. That should only apply if you are dynamically creating your Controls.
A simple solution is to call Gridview.DataBind() on the Page.Pre_Render event, which makes it called after having handled any Button/Sorting, events. This a good way to ensure you call it only once per Request.
To make things clearer, it is also a good thing to access your dataset through a Property which will basically call your "Store-The-Dataset-In-The-Session-Somehow-In-Case-They-Call-Sort-In-The-Future" method in its Set part and your "Get-Data-Set-Out-Of-Session-That-Had-Better-Be-There" in the Get part.
You may try to fill the grid on Gridview Needdatasource event
it will be called when ever you perform a postback and get the proper functionality what ever you code in the event.
also if you want to bind it again you can just data databind method and that will call the needdatasource event again

Crystal Report error Missing parameter values when move to next page

My Crystal Report works fine in the first page but when i click on the next page button the report doesn't load and gives Missing parameter values error. Can anybody help me to solve this problem.
My current coding is given below.
protected void ddlStudent_SelectedIndexChanged(object sender, EventArgs e)
{
GenerateReport();
}
protected void GenerateReport()
{
//Create report document
ReportDocument crystalReport = new ReportDocument();
//Load crystal report made in design view
crystalReport.Load(Server.MapPath("Reports/PhotoGallery.rpt"));
//Set DataBase Login Info
crystalReport.SetDatabaseLogon("root", "pwd", #"localhost", "nsis");
//Provide parameter values
crystalReport.SetParameterValue("adno", adNo);
crvReportViewer.ReportSource = crystalReport;
}
I think you need to call GenerateReport(); method in page load as well try following
protected void ddlStudent_SelectedIndexChanged(object sender, EventArgs e)
{
GenerateReport();
ViewState["ReportLoad"] = "Load";
}
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["ReportLoad"] != null)
{
GenerateReport();
}
}

The GridView 'GridView1' fired event PageIndexChanging which wasn't handled

I have created:
one master page and one content page called Detail.
On Button click event, displaying data in grid view.
In grid view, columns are autogenerated.
I wanted to show 11 column in grid view, but it is more than page
size.
What to do for this?
I have created sql helper file for database connection code and calling that method, not using sqldatasource for connection.
When I trying to do paging, getting error:
The GridView 'GridView1' fired event PageIndexChanging which wasn't
handled.
You need to declare a method on your code behind that handles the PageIndexChanging event.
Something similar to this:
protected void GridView1_PageIndexChanging (object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
bindGridView(); //bindgridview will get the data source and bind it again
}
private void bindGridView()
{
GridView1.DataSource=getData();
GridView1.DataBind();
}
Providing sample code:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
bindGridView(); //bindgridview will get the data source and bind it again
}
protected void Page_Load(object sender , EventArgs e)
{
if(!IsPostBack)
bindGridView();
}
//this is some sample data
private void bindGridView()
{
DataTable t = new DataTable();
t.Columns.Add("Col1");
t.Columns.Add("Col2");
DataRow r = null;
for (int i = 0; i < 25; i++)
{
r = t.NewRow();
r.ItemArray = new object[] { "Val" + i, " Another " + i };
t.Rows.Add(r);
}
GridView1.DataSource = t;
GridView1.DataBind();
}
And this is the markup:
<asp:GridView OnPageIndexChanging="GridView1_PageIndexChanging" AllowPaging="true" PageSize="10" ID="GridView1" runat="server" AutoGenerateColumns="true">
Produces this:
For Paging you can use OnPageIndexChanging for this....
For Example
you have to use OnPageIndexChanging="gvdetails_PageIndexChanging" in your GridView...
You have to write below code into event in code behind like
protected void gvdetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvdetails.PageIndex = e.NewPageIndex;
BindData();
}
For more detail you can check the below link here I am using page Index change in my article...
Here I use PageIndexChange
I hope this will helps you....Share it with others...Thanks!
This is the final answer:
Imports System.Collections.Generic ' library
Protected Sub grdEmployees_PageIndexChanging1(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.GridViewPageEventArgs) Handles grdEmployees.PageIndexChanging
grdEmployees.PageIndex = e.NewPageIndex
LoadEmployeeList() 'FUNCTION FOR DATASET
grdEmployees.DataBind()
End Sub
you simply add this to your code :
protected void GridViewTrsEmail_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridViewTrsEmail.PageIndex = e.NewPageIndex;
GridViewTrsEmail.DataBind();
}
To fix this, I had to take a closer look at my datasource and datakeys. I have a set of records that are returned from SQL Server and what I was doing is binding them to a POCO. This class had several public properties of type Integer. These Integers were my datakeys on the grid. I replaced their type with a string instead to bypass the casting issue.

Resources