FormView Manual Data binding - c#

I have a FormView that I user for updating a record. There is a link button that when fires should perforom the updating via BLL and DAL. I am not using built-in ODS and I will not condsider using it.
I have all my grids and formviews populated manuualy by calling methods that fetch the data from the database.
For instance my details view is populated like this:
protected void DlMembers_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName.ToString() == "Select")
{
DlMembers.Visible = false;
lblError.Text = string.Empty;
lblError.Visible = false;
fvMemberDetail.Visible = true;
fvMemberDetail.ChangeMode(FormViewMode.Edit);
MemberBLL getMemberInfo = new MemberBLL();
int Ident = Convert.ToInt32(e.CommandArgument.ToString());
fvMemberDetail.DataSource = getMemberInfo.GetMemberByIdent(Ident);
fvMemberDetail.DataBind();
}
if (e.CommandName.ToString() == "DeleteSelected")
{
DlMembers.Visible = true;
lblError.Text = string.Empty;
lblError.Visible = false;
fvMemberDetail.Visible = false;
fvMemberDetail.ChangeMode(FormViewMode.ReadOnly);
}
What I want to do if to capature my linkbutton on click event and do this (except that the runtime never reaches this method):
protected void MemberInfoUpdating(object sender, EventArgs e)
{
TextBox id = (TextBox)fvMemberDetail.FindControl("txtIdent");
if (id.Text != string.Empty || id.Text != "")
{
TextBox txtFN = (TextBox)fvMemberDetail.FindControl("txtFN");
TextBox txtLN = (TextBox)fvMemberDetail.FindControl("txtLN");
DropDownList ddlAddress = (DropDownList)fvMemberDetail.FindControl("ddlAddress");
TextBox txtEmail = (TextBox)fvMemberDetail.FindControl("txtEmail");
TextBox txtHPhone = (TextBox)fvMemberDetail.FindControl("txtHPhone");
TextBox txtWPhone = (TextBox)fvMemberDetail.FindControl("txtWPhone");
TextBox txtMPhone = (TextBox)fvMemberDetail.FindControl("txtMPhone");
DropDownList ddlPos = (DropDownList)fvMemberDetail.FindControl("ddlPos");
DropDownList ddlIsAdmin = (DropDownList)fvMemberDetail.FindControl("ddlIsAdmin");
bool blIsAdmin = false;
if (ddlIsAdmin.SelectedValue == "True") blIsAdmin = true;
TextBox txtComments = (TextBox)fvMemberDetail.FindControl("txtComments");
MemberBLL updateMemberInfo = new MemberBLL();
bool UpdateOK = updateMemberInfo.UpdateMemberByIdent(
txtFN.Text,
txtLN.Text,
ddlAddress.SelectedValue,
txtEmail.Text,
txtHPhone.Text,
txtWPhone.Text,
txtMPhone.Text,
blIsAdmin,
txtComments.Text,
Convert.ToInt32(ddlPos.SelectedValue),
Convert.ToInt32(id.Text));
}
else
{
//Display error - no user id cannot update record
}
}
The linkbutton looks like this:
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
OnClick="MemberInfoUpdating" Text="Update" />

Where is this LinkButton? If it's inside a FormView template, then you'll likely need to use something like this instead:
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update" Text="Update" />
Then handle the "Update" command in DlMembers_ItemCommand.
Alternatively, attach your code to the OnItemUpdating event of the FormView rather than some extra event you don't need:
<asp:FormView ID="fvMemberDetail" runat="server" OnItemUpdating="MemberInfoUpdating">

Related

Creating a single "view" button method for gridview

I'm just trying to create a single button "view" click for the data in the specific row for gridview and pass it to a Silverlight viewer.
Here's a "viewall" button I'm trying to figure out off of.
protected void btnViewAll_Click(object sender, EventArgs e)
{
string id = HttpContext.Current.Request.Headers["id"];
#if DEBUG
if (id == null)
id = "111"; // Use my own id for testing locally
#endif
using (aDataContext dc = new aDataContext())
{
var query = (from a in dc.aLists
where a.ID == id
select new
{
a.aNumber,
a.bNumber,
a.cNumber,
a.dNumber,
}
);
List<aListItem> List = new List<aListItem>();
foreach (var queryItem in query)
{
aList.Add(new aListItem()
{
aNumber = queryItem.aNumber,
bNumber = queryItem.bNumber,
cNumber = queryItem.cNumber,
dNumber = queryItem.dNumber
});
}
Session["aList"] = aList;
}
Session["Database"] = null;
Response.Redirect("Viewer.aspx" + "?UseList=true");
}
Solution 1:
It can be done with a ButtonField in the GridView:
Add the row-specific info to the DataKeyNames of the GridView (e.g. if the fields "name1" and "age2" of your data source are needed to view with your Silverlight viewer):
<asp:GridView ID="gvClients" DataKeyNames="name1,age2" ... >
Add a ButtonField to the GridView:
<asp:ButtonField ButtonType="Button" CommandName="View" Text="View" />
Set the RowCommand event handler (can be done in markup or in code):
gvClients.RowCommand += new GridViewCommandEventHandler(gvClients_RowCommand);
And process the command:
void gvClients_RowCommand(object sender, GridViewCommandEventArgs e)
{
int rowIndex = Convert.ToInt32(e.CommandArgument);
string name1 = (string)gvClients.DataKeys[rowIndex].Values["name1"];
int age2 = (int)gvClients.DataKeys[rowIndex].Values["age2"];
// Open docName with the viewer
...
}
Solution 2: An alternative, which avoids a postback, would be to use a a HyperLinkField:
<asp:HyperLinkField Text="View" DataNavigateUrlFormatString="Viewer.aspx?Name={0}&Age={1}" DataNavigateUrlFields="name1,age2" />

Gridview dataBound add hyperlink to column data from code behind

Using grid view binding it from code behind:
I want to bind a particular column data into a hyper link so when it clicked it should do a download.
How to do that ?
Below is my code :
for (int i = 0; i <= tbl.Columns.Count - 1; i++)
{
Telerik.Web.UI.GridBoundColumn boundfield = new Telerik.Web.UI.GridBoundColumn();
if (tbl.Columns[i].ColumnName.ToString() == "Row")
{
LinkButton lkbtn = new LinkButton();
lkbtn.CommandName = i;
lkbtn.CommandArgument = "dwnld";
lkbtn.Font.Underline = true;
lkbtn.Text = tbl.Columns(i).ColumnName.ToString();
boundfield.DataField = tbl.Columns(i).ColumnName.ToString()
boundfield.HeaderText = tbl.Columns(i).ColumnName.ToString();
GridView2.MasterTableView.Columns.Add(boundfield);
}
}
Why not use grid template column with link button.
<telerik:GridTemplateColumn>
<ItemTemplate>
<asp:LinkButton ID="btnDownload" OnClick="btnDownload_Click" runat="server">Download Something</asp:LinkButton>
</ItemTemplate>
</telerik:GridTemplateColumn>
protected void btnDownload_Click(object sender, EventArgs e)
{
LinkButton lbBtn = sender as LinkButton;
GridDataItem item = (GridDataItem)(sender as LinkButton).NamingContainer;
// Use item to get other details
...
...
}

How to save changes from DropDownList to sql database?

I edited a DataGrid column so the location is now a DropDownList, which works fine. It populates the DropDownList from the database.
<asp:TemplateColumn HeaderText="Trailer Location">
<itemtemplate>
<asp:DropDownList ID="ddlTrailerLoc" runat="server" OnSelectedIndexChanged="ddlTrailerLoc_SelectedIndexChanged">
</asp:DropDownList>
<asp:HiddenField ID="hdlTrailerLoc" runat="server" Value='<%#Eval("TrailerLocation")%>' />
</itemtemplate>
</asp:TemplateColumn>
But when I change the value in the DropDownList I don't know how to save the changes made to the database.
protected void PopulateDDLs(DropDownList ddlTrailerLoc)
{
DataSet dsTrailerLocation = DataUtils.GetAllGenSmall(Company.Current.CompanyID, "Description", "", 1, false, "Description", false, "TrailerLocationNOCODE", 0);
if (dsTrailerLocation.Tables[0].Rows.Count > 0)
{
ddlTrailerLoc.DataSource = dsTrailerLocation;
ddlTrailerLoc.DataValueField = "Description";
ddlTrailerLoc.DataTextField = "Description";
ddlTrailerLoc.DataBind();
}
else
{
ddlTrailerLoc.Items.Insert(0, new ListItem("No Locations Entered", "0"));
}
}
protected void dgList_ItemCreated(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Pager && e.Item.ItemType != ListItemType.Footer)
{
DropDownList ddlTrailerLocation = e.Item.FindControl("ddlTrailerLoc") as DropDownList;
if (ddlTrailerLocation != null)
{
PopulateDDLs(ddlTrailerLocation);
//set the value in dropdown
HiddenField hdlTrailerLoc = e.Item.FindControl("hdlTrailerLoc") as HiddenField;
if (hdlTrailerLoc != null)
{
ddlTrailerLocation.SelectedValue = hdlTrailerLoc.Value;
}
}
}
}
I tried creating this ddlTrailerLoc_SelectedIndexChanged method but the event doesn't run.
protected void ddlTrailerLoc_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList list = (DropDownList)sender;
TableCell cell = list.Parent as TableCell;
DataGridItem item = cell.Parent as DataGridItem;
int selectedIndex = item.ItemIndex;
string selectedItem = item.Cells[0].Text;
// now save your work here and rebind the grid.
Trailer.UpdateTrailer(int.Parse(TrailerID), Company.Current.CompanyID,
txtTrailerReg.Text,
ddlTrailerLocation.Text);
ddlTrailerLocation.DataValueField = "Description";
ddlTrailerLocation.DataTextField = "Description";
ddlTrailerLocation.DataBind();
}
Please add AutoPostBack="True" in dropdown. It will work
<asp:DropDownList ID="ddlTrailerLoc" runat="server" OnSelectedIndexChanged="ddlTrailerLoc_SelectedIndexChanged" AutoPostBack="True"></asp:DropDownList>
Please write code as below
protected void ddlTrailerLoc_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddlTrailerLoc=sender as DropDownList;
if(ddlTrailerLoc!=null)
{
int trailerId=int.Parse(ddlTrailerLoc.SelectedValue.ToString());
//Save selected value in Database
// now save your work here and rebind the grid.
Trailer.UpdateTrailer(trailerId, Company.Current.CompanyID,
txtTrailerReg.Text,
ddlTrailerLoc.Text);
ddlTrailerLocation.DataValueField = "Description";
ddlTrailerLocation.DataTextField = "Description";
ddlTrailerLocation.DataBind();
}
}

How to fire click event of the LinkButton in gridview and Show PopUp window in asp.net

I have tried to build one gridview with dynamic columns based the data source using the template fields in asp.net through code behind.
For that, to implement we have developed one class DynamicTemplate which implements the ITemplate interface. In that template fields i have inserted the LinkButton in each cell and when i click that cell link button i need to show the one Popup with selected cell value.
For Detailed Sample Please download from this link
For that I have created one Default.asxp page and wrote the following.
public partial class Default : System.Web.UI.Page
{
DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
GenateGridView();
}
private void GenateGridView()
{
TemplateField tempField;
DynamicTemplate dynTempItem;
LinkButton lnkButton;
Label label;
GridView gvDynamicArticle = new GridView();
gvDynamicArticle.Width = Unit.Pixel(500);
gvDynamicArticle.BorderWidth = Unit.Pixel(0);
gvDynamicArticle.Caption = "<div>Default Grid</div>";
gvDynamicArticle.AutoGenerateColumns = false;
DataTable data = getBindingData();
for (int i = 0; i < data.Columns.Count; i++)
{
tempField = new TemplateField();
dynTempItem = new DynamicTemplate(ListItemType.AlternatingItem);
lnkButton = new LinkButton();
lnkButton.ID = string.Format("lnkButton{0}", i);
lnkButton.Visible = true;
string ColumnValue = data.Columns[i].ColumnName;
tempField.HeaderText = ColumnValue;
if (ColumnValue == "EmpName")
{
label = new Label();
label.ID = string.Format("Label{0}", i);
dynTempItem.AddControl(label, "Text", ColumnValue);
label.Width = 100;
}
else
{
dynTempItem.AddControl(lnkButton, "Text", ColumnValue);
lnkButton.Click += lnkButton_Click;
}
tempField.ItemTemplate = dynTempItem;
gvDynamicArticle.Columns.Add(tempField);
//////grdUserPivotDateTwo.Columns.Add(tempField);
}
gvDynamicArticle.DataSource = data;
gvDynamicArticle.DataBind();
divContainer.Controls.Add(gvDynamicArticle);
}
void lnkButton_Click(object sender, EventArgs e)
{
// showing cell values in popUp here..
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('cell clicked')");
}
private DataTable getBindingData()
{
dt = new DataTable();
dt.Columns.Add(new DataColumn("EmpName"));
dt.Columns.Add(new DataColumn("Monday"));
dt.Columns.Add(new DataColumn("TuesDay"));
dt.Columns.Add(new DataColumn("WednesDay"));
dt.Columns.Add(new DataColumn("ThursDay"));
dt.Rows.Add("EmpOne", "p", "p", "p", "a");
dt.Rows.Add("EmpTwo", "p", "a", "p", "p");
dt.Rows.Add("EmpThree", "p", "p", "p", "a");
dt.Rows.Add("EmpFour", "p", "a", "p", "p");
dt.Rows.Add("EmpFive", "p", "p", "p", "a");
dt.Rows.Add("EmpSix", "a", "p", "p", "p");
return dt;
}
}
and corresponding DynamicTemplate class is
public class DynamicTemplate : System.Web.UI.ITemplate
{
System.Web.UI.WebControls.ListItemType templateType;
System.Collections.Hashtable htControls = new System.Collections.Hashtable();
System.Collections.Hashtable htBindPropertiesNames = new System.Collections.Hashtable();
System.Collections.Hashtable htBindExpression = new System.Collections.Hashtable();
public DynamicTemplate(System.Web.UI.WebControls.ListItemType type)
{
templateType = type;
}
public void AddControl(WebControl wbControl, String BindPropertyName, String BindExpression)
{
htControls.Add(htControls.Count, wbControl);
htBindPropertiesNames.Add(htBindPropertiesNames.Count, BindPropertyName);
htBindExpression.Add(htBindExpression.Count, BindExpression);
}
public void InstantiateIn(System.Web.UI.Control container)
{
PlaceHolder ph = new PlaceHolder();
for (int i = 0; i < htControls.Count; i++)
{
//clone control
Control cntrl = CloneControl((Control)htControls[i]);
switch (templateType)
{
case ListItemType.Header:
break;
case ListItemType.Item:
ph.Controls.Add(cntrl);
break;
case ListItemType.AlternatingItem:
ph.Controls.Add(cntrl);
ph.DataBinding += new EventHandler(Item_DataBinding);
break;
case ListItemType.Footer:
break;
}
}
ph.DataBinding += new EventHandler(Item_DataBinding);
container.Controls.Add(ph);
}
public void Item_DataBinding(object sender, System.EventArgs e)
{
PlaceHolder ph = (PlaceHolder)sender;
GridViewRow ri = (GridViewRow)ph.NamingContainer;
for (int i = 0; i < htControls.Count; i++)
{
if (htBindPropertiesNames[i].ToString().Length > 0)
{
Control tmpCtrl = (Control)htControls[i];
String item1Value = (String)DataBinder.Eval(ri.DataItem, htBindExpression[i].ToString());
Control ctrl = ph.FindControl(tmpCtrl.ID);
Type t = ctrl.GetType();
System.Reflection.PropertyInfo pi = t.GetProperty(htBindPropertiesNames[i].ToString());
pi.SetValue(ctrl, item1Value.ToString(), null);
}
}
}
private Control CloneControl(System.Web.UI.Control src_ctl)
{
Type t = src_ctl.GetType();
Object obj = Activator.CreateInstance(t);
Control dst_ctl = (Control)obj;
PropertyDescriptorCollection src_pdc = TypeDescriptor.GetProperties(src_ctl);
PropertyDescriptorCollection dst_pdc = TypeDescriptor.GetProperties(dst_ctl);
for (int i = 0; i < src_pdc.Count; i++)
{
if (src_pdc[i].Attributes.Contains(DesignerSerializationVisibilityAttribute.Content))
{
object collection_val = src_pdc[i].GetValue(src_ctl);
if ((collection_val is IList) == true)
{
foreach (object child in (IList)collection_val)
{
Control new_child = CloneControl(child as Control);
object dst_collection_val = dst_pdc[i].GetValue(dst_ctl);
((IList)dst_collection_val).Add(new_child);
}
}
}
else
{
dst_pdc[src_pdc[i].Name].SetValue(dst_ctl, src_pdc[i].GetValue(src_ctl));
}
}
return dst_ctl;
}
}
Here the Data showing in gridview is fine. Here the Issues are when i click on the linkButton the page reloads and no grid is displaying after the postback.
second issue is, for LinkButton the Click Event is not firing.
Please provide me the help full information/Sample to show the modal window when we click on the linkButton of the gridview.
You need to use ajax model popup expender.
Design a panel with your fields and use the model popup expender to display that popup
This link has the sample of it
www.asp.net/ajaxlibrary/ajaxcontroltoolkitsamplesite/modalpopup/modalpopup.aspx
and in your link button click
you have to use show method to open popup
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
GenateGridView();
}
this code is generating a gridview only if it is not a postback, but when you click a linkbutton a postpack occurs and that's the reason why gridview doesnt show again when you click on the linkbutton.
add the following code(additional else part included to your if code) to show gridview when you click lnkButton
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
GenateGridView();
else
{
string ctrlName = Request.Params.Get("__EVENTTARGET").Trim();
if (!String.IsNullOrEmpty(ctrlName))
{
if (ctrlName.StartsWith("lnkButton"))
{
GenateGridView();
}
}
}
}
It will be a good choice to use CommandName property for the linkbutton on the Gridview and give it a specfic name and in the code file and exactly work with it in RowCommand event of your GridView as following in this example :
first here is the .aspx file :
<div>
<asp:GridView ID="GridViewStudents" runat="server" AutoGenerateColumns="False" OnRowCommand="GridViewStudents_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Stud_ID" Visible="False">
<ItemTemplate>
<asp:Label ID="LabelStudID" runat="server" Text='<%# Eval("Stud_ID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="FKFather_ID" Visible="False">
<ItemTemplate>
<asp:Label ID="LabelFkFatherID" runat="server" Text='<%# Eval("Fk_Father_ID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Student Name">
<ItemTemplate>
<asp:Label ID="LabelStudName" runat="server" Text='<%# Eval("Stud_Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Class Name">
<ItemTemplate>
<asp:Label ID="LabelRowlevelName" runat="server" Text='<%# Eval("Stud_Level_Row_Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Delete">
<ItemTemplate>
<asp:ImageButton ID="ImageButtonDelete" runat="server" CommandArgument='<%# Eval("Stud_ID") %>' CommandName="Remove" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<div style="direction: ltr">
<asp:Panel ID="Panel1" runat="server" Visible="false">
<asp:Label ID="Labelpopupmessage" runat="server" Text=""></asp:Label>
<br />
<asp:Button ID="Buttonaccept" runat="server" Text="نعم" OnClick="Buttonaccept_Click" />
<asp:Button ID="Buttoncancel" runat="server" Text="لا" OnClick="Buttoncancel_Click" />
</asp:Panel>
<asp:HiddenField ID="HiddenField1" runat="server" />
<asp:ModalPopupExtender runat="server" ID="ModalPopupExtenderStudent" PopupControlID="ButtonSubmit" TargetControlID="HiddenField1" CancelControlID="Buttoncancel">
</asp:ModalPopupExtender>
</div>
and here is the code implementation of my illustration :
protected void GridViewStudents_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Remove")
{
// I stored the ID of the selected Student I want to delete in a viewstate.
ViewState.Add("DeletedStudDetailID",Convert.ToInt32(e.CommandArgument));
ModalpopupExtender.Show();
}
}
// Here in the accept delete button I used that code ..
protected void Buttonaccept_Click(object sender, EventArgs e)
{
try
{
if (ViewState["DeletedStudDetailID"] != null)
{
StudentDetail StudDet = Data.StudentDetails.Single(SD => SD.Fk_Stud_ID == Convert.ToInt32(ViewState["DeletedStudDetailID"]));
Data.StudentDetails.DeleteOnSubmit(StudDet);
Student Stud = Data.Students.Single(S => S.Stud_ID == Convert.ToInt32(ViewState["DeletedStudDetailID"]));
Data.Students.DeleteOnSubmit(Stud);
Data.SubmitChanges();
}
this.ResultMessage = "Delete Done Sucessfully !!";
}
catch
{
this.ErrorMessage = "Delete operation disordered !!";
}
finally
{
ModalPopExtender.Hide();
}
}
I hope it helps in your issue and I wish you a happy day :) !!
First, your GridView will be created when calling GenateGridView method, so you have to call this method everytime you do post back, then your Page_Load should be
protected void Page_Load(object sender, EventArgs e)
{
GenateGridView();
}
Second, I would present you the other way to add LinkButton to GridView dynamically.
I modified your GenateGridView to just add only label into DynamicTemplate, also add this line gvDynamicArticle.RowDataBound += new GridViewRowEventHandler(gvDynamicArticle_RowDataBound); to handle adding LinkButton.
private void GenateGridView()
{
TemplateField tempField;
DynamicTemplate dynTempItem;
Label label;
GridView gvDynamicArticle = new GridView();
gvDynamicArticle.Width = Unit.Pixel(500);
gvDynamicArticle.BorderWidth = Unit.Pixel(0);
gvDynamicArticle.Caption = "<div>Default Grid</div>";
gvDynamicArticle.AutoGenerateColumns = false;
gvDynamicArticle.RowDataBound += new GridViewRowEventHandler(gvDynamicArticle_RowDataBound);
DataTable data = getBindingData();
for (int i = 0; i < data.Columns.Count; i++)
{
tempField = new TemplateField();
dynTempItem = new DynamicTemplate(ListItemType.AlternatingItem);
string ColumnValue = data.Columns[i].ColumnName;
tempField.HeaderText = ColumnValue;
label = new Label();
label.ID = string.Format("Label{0}", i);
dynTempItem.AddControl(label, "Text", ColumnValue);
label.Width = 100;
tempField.ItemTemplate = dynTempItem;
gvDynamicArticle.Columns.Add(tempField);
}
gvDynamicArticle.DataSource = data;
gvDynamicArticle.DataBind();
divContainer.Controls.Add(gvDynamicArticle);
}
I implement like this in RowDataBound event handler of the GridView to add LinkButton and hide the Label which we added it before:
protected void gvDynamicArticle_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int j = 1; j < e.Row.Cells.Count; j++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton lnkButton = new LinkButton();
lnkButton.ID = string.Format("lnkButton{0}{1}", e.Row.DataItemIndex, j);
lnkButton.Click += new EventHandler(lnkButton_Click);
Label tempLabel = e.Row.FindControl("Label" + j) as Label;
lnkButton.Text = tempLabel.Text;
lnkButton.CommandArgument = tempLabel.Text;
tempLabel.Visible = false;
e.Row.Cells[j].Controls.Add(lnkButton);
}
}
}
You can also set any value to CommandArgument of LinkButton, then you can show it in the alert.
Final, seems you want to show some value in the alert, you may code like this
public void lnkButton_Click(object sender, EventArgs e)
{
// showing cell values in popUp here..
LinkButton lnk = (LinkButton)sender;
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('cell clicked, value " + lnk.CommandArgument + "')", true);
}

Gridview error when change header name with the only 1 data is visible

From the title above, my code at the first time page_load, there is no problem, it show correctly but after I click button to change language, it is disappear(only show header). I spend about one week to find out but still cannot find what happen.
If the visible data MORE than 1, its working properly.
EDIT:
Forgot to put my page Load method
protected void Page_Load(object sender, EventArgs e)
{
NoResult.Visible = false;
Get_Data();
}
protected void Get_Data()
{
DBCAD.Service1 myCADDB = new DBCAD.Service1();
myCADDB.UseDefaultCredentials = true;
string result = "";
//set web service proxy
if (!GlobalVariable_CCCNS.filterOrNot)
{
//invoke web service method
result = myCADDB.CallCardStatus_Filter_CCCNSEMBILAN_ALL();
}
else
{
GlobalVariable_CCCNS.FilterDC = DropDownList1.SelectedValue;
//invoke web service method
if (GlobalVariable_CCCNS.FilterDC == "CCC NS ALL")
{
result = myCADDB.CallCardStatus_Filter_CCCNSEMBILAN_ALL();
}
else
{
result = myCADDB.CallCardStatus_Filter(GlobalVariable_CCCNS.FilterDC);
}
}
//read the response data and put in xml document
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(result);
string mypath = Server.MapPath(#"Data.xml");
//XmlTextReader reader = new XmlTextReader ("DBCAD.xml");
xmlDoc.Save(mypath);
//set the data set
DataSet ds = new DataSet();
ds.ReadXml(mypath);
//Open hidden column
CallCardStatus.Columns[0].Visible = true;
if (ds.Tables.Count > 0)
{
//list out the result to Data Grid
CallCardStatus.DataSource = ds;
CallCardStatus.DataBind();
}
else
{
NoResult.Visible = true;
}
//Clear Unwanted Column
CallCardStatus.Columns[0].Visible = false;
}
Here is my RowDataBound
string lastRow = "";
protected void CallCardStatus_RowDataBound(object sender, GridViewRowEventArgs e)
{
//Many item with same id but different status, I just want to visible and get the first row for each id.
if (e.Row.RowType == DataControlRowType.DataRow)
{
var thisRow = e.Row;
if (thisRow.Cells[0].Text == lastRow)
{
e.Row.Visible = false;
}
lastRow = thisRow.Cells[0].Text;
}
}
Here is my RadioButton for Language Malay and English
protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
{
GlobalVariable_CCCNS.cultureName = RadioButtonList1.SelectedValue.ToString();
Page.Culture = GlobalVariable_CCCNS.cultureName;
Page.UICulture = GlobalVariable_CCCNS.cultureName;
if (GlobalVariable_CCCNS.cultureName == "ms-MY")
{
Label2.Visible = false;
Label2.Text = "Kawalan Status Kad Panggilan";
Label2.Visible = true;
}
else
{
Label2.Visible = false;
Label2.Text = "CallCard Status Monitoring";
Label2.Visible = true;
}
Page_Render();
}
protected void Page_Render()
{
Page.Culture = GlobalVariable_CCCNS.cultureName;
Page.UICulture = GlobalVariable_CCCNS.cultureName;
ALL.Text = GetLocalResourceObject("ALLResource1.Text").ToString();
Label1.Text = GetLocalResourceObject("Label1Resource1.Text").ToString();
NoResult.Text = GetLocalResourceObject("NoResultResource1.Text").ToString();
DBCAD.Service1 myCADDB = new DBCAD.Service1();
myCADDB.UseDefaultCredentials = true;
string result = "";
//set web service proxy
if (!GlobalVariable_CCCNS.filterOrNot)
{
//invoke web service method
result = myCADDB.CallCardStatus_Filter_CCCNSEMBILAN_ALL();
}
else
{
GlobalVariable_CCCNS.FilterDC = DropDownList1.SelectedValue;
//invoke web service method
if (GlobalVariable_CCCNS.FilterDC == "CCC NS ALL"){
result = myCADDB.CallCardStatus_Filter_CCCNSEMBILAN_ALL();
}else{
//invoke web service method
result = myCADDB.CallCardStatus_Filter(GlobalVariable_CCCNS.FilterDC);
}
}
//read the response data and put in xml document
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(result);
string mypath = Server.MapPath(#"Data.xml");
//XmlTextReader reader = new XmlTextReader ("DBCAD.xml");
xmlDoc.Save(mypath);
//set the data set
DataSet ds = new DataSet();
ds.ReadXml(mypath);
// CallCardStatus.DataSource = ds;
//CallCardStatus.DataBind();
//Open hidden column
CallCardStatus.Columns[0].Visible = true;
if (ds.Tables.Count > 0)
{
//list out the result to Data Grid
CallCardStatus.DataSource = ds;
CallCardStatus.Columns[2].HeaderText = GetLocalResourceObject("ButtonFieldResource1.Text").ToString();
CallCardStatus.Columns[3].HeaderText = GetLocalResourceObject("BoundFieldResource3.HeaderText").ToString();
CallCardStatus.Columns[4].HeaderText = GetLocalResourceObject("BoundFieldResource4.HeaderText").ToString();
CallCardStatus.Columns[5].HeaderText = GetLocalResourceObject("BoundFieldResource5.HeaderText").ToString();
CallCardStatus.Columns[6].HeaderText = GetLocalResourceObject("BoundFieldResource6.HeaderText").ToString();
CallCardStatus.Columns[7].HeaderText = GetLocalResourceObject("BoundFieldResource7.HeaderText").ToString();
CallCardStatus.Columns[8].HeaderText = GetLocalResourceObject("BoundFieldResource8.HeaderText").ToString();
CallCardStatus.Columns[9].HeaderText = GetLocalResourceObject("BoundFieldResource9.HeaderText").ToString();
CallCardStatus.DataBind();
}
else
{
NoResult.Visible = true;
}
//Clear Unwanted Column
CallCardStatus.Columns[0].Visible = false;
}
Anyone can help?Thanks..Siti..:)
In order to clean up your legacy code a little bit, I recommend you the following: (cleaning your code will help u to spot the error easier)
Binding your GridView
The best practice to bind a data-bound control is inside the Page_Load event:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
// in this method u will bind your GridView
this.BindGrid();
}
}
Unless I'm missing something, the code inside the Page_Render method is used to render your GridView, and that code is duplicated in the Get_Data method. You could place the code specific to bind your GridView inside one single method.
Now you only need to re-bind your GridView when its content has changed, for example if you allow your users to edit your GridView records. Otherwise, you should not re-bind it. (This is true, as long as your page has EnableViewState="true")
The code to localize your GridView columns can be moved to the GridVew.DataBound event. Or even better, delegate the logic to localize the view to your markup, to do it, you could create templated columns in your GridView.
Example:
<asp:GridView runat="server" DataSourceID="lds" ID="gv"
AutoGenerateColumns="false"
>
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Label Text="<%$ Resources: your_resource_file_name_without_extension, your resource_key %>" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="a_meaningfull_name" Text='<%# Eval("your_field_name") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Set the page language overriding the Page.InitializeCulture method:
Note that you only need to set this.UICulture = culture; and this.Culture = culture; inside this method
protected override void InitializeCulture()
{
// you have to call Request.Form, because at this point in the page life cycle, the page viewstate has not been loaded yet
var culture = this.Request.Form["RadioButtonList1"];
if (!string.IsNullOrWhiteSpace(culture))
{
// if the values of your list are culture specific (ie. en-US, es-MX, etc) you can uncomment the following line
// this.Culture = culture;
this.UICulture = culture;
base.InitializeCulture();
}
}
Using this approach you do not need the RadioButtonList1_SelectedIndexChanged event. The code you are placing inside this event won't be necessary.
This code:
if (GlobalVariable_CCCNS.cultureName == "ms-MY")
{
Label2.Visible = false;
Label2.Text = "Kawalan Status Kad Panggilan";
Label2.Visible = true;
}
else
{
Label2.Visible = false;
Label2.Text = "CallCard Status Monitoring";
Label2.Visible = true;
}
Can be easily eliminated using markup: (note that you will need to create one resource file for each language you want to use in your application, to learn more about ASP.Net Globalization click here)
Using global resources
<!-- Assuming global resources -->
<asp:Label runat="server" ID="Label2" Text="<%$ Resources: your_resource_file_name_without_extension, your_resource_key %>" />
Your global resource file would look like:
<data name="your_resource_key" xml:space="preserve">
<value>your text</value>
</data>
Using local resources
<!-- Assuming local implicit resources -->
<asp:Label runat="server" ID="Label2" meta:resourcekey="base_name_of_your_resource_key" Text="default value used to render the control at design time in VS" />
In this case, your local resource file would look like:
<data name="base_name_of_your_resource_key.Text" xml:space="preserve">
<value>your text</value>
</data>
You do not need to call Page_Render(); in the RadioButtonList1_SelectedIndexChanged event

Categories