I have a ListView displaying Products. I'm trying to add a Category label before each list of products, where each category may have several products. I'm trying to achieve this without nesting ListViews. Right now the issue is that it is repeating the category name over every product name. This is not what I want. I only want it to list the category name over products when the category name changes. Both Product and Category are being returned from the same DB table.
Category 1
Product 1
Product 2
Category 2
Product 3
Product 4
<asp:ListView ID="classesList" ItemPlaceholderID="classesPlaceHolder"
OnItemDataBound="ClassesList_ItemDataBound" runat="server">
<LayoutTemplate>
<asp:Panel ID="classesPanel" CssClass="classesPanel" runat="server">
<asp:PlaceHolder runat="server" ID="classesPlaceHolder"></asp:PlaceHolder>
</asp:Panel>
</LayoutTemplate>
<ItemTemplate>
<strong><asp:Label ID="categoryNameLabel" runat="server"></asp:Label></strong>
<a href='#'><%# Eval("product_name") %></a><br />
</ItemTemplate>
</asp:ListView>
protected void ClassesList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
DataRowView row = (DataRowView)e.Item.DataItem;
Label categoryNameLabel = e.Item.FindControl("categoryNameLabel") as Label;
if (!categoryNameLabel.Text.Contains(row["cat_name"].ToString()))
{
categoryNameLabel.Text = row["cat_name"].ToString() + "<br />";
}
}
}
Doing this in a loop would be trivial. But since the ItemDataBound event fires for every data item coming back, I'm trying to find a simple way of doing this.
UPDATE
I moved the data binding out of the Page Load method to a method called GetClasses(). This new method is called from the first page load. I gave up on the ItemDataBound method as I wanted to implement a loop and toggle the visibility of the categoryLabel. Unfortunately, no category is appearing now so maybe I'm missing something?
<ItemTemplate>
<strong><asp:Label ID="categoryNameLabel" Visible="false" runat="server"></asp:Label></strong>
<i class="fa fa-angle-double-right" aria-hidden="true"></i>
<a href='#'><%# Eval("product_name") %></a><br />
</ItemTemplate>
public void GetClasses()
{
DataSet ds = CatalogDALC.GetClassesByCategory(categoryID, DateTime.Now);
classesList.DataSource = ds;
classesList.DataBind();
// Set main category header for classes - loop here and set category name headers
int count = 0;
foreach (ListViewDataItem item in classesList.Items)
{
Label categoryNameLabel = item.FindControl("categoryNameLabel") as Label;
if (count == 0) // Set the first category name header regardless
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
else
{
if (ds.Tables[0].Rows[count-1]["cat_name"].ToString() != ds.Tables[0].Rows[count]["cat_name"].ToString())
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
else
{
categoryNameLabel.Visible = false;
continue;
}
}
count++;
}
}
My updated solution in the question was the right approach - the only bug was the continue statement - it was bypassing the counter. This is the working version for anyone in a similar situation:
<ItemTemplate>
<strong><asp:Label ID="categoryNameLabel" Visible="false" runat="server"></asp:Label></strong>
<i class="fa fa-angle-double-right" aria-hidden="true"></i>
<a href='#'><%# Eval("product_name") %></a><br />
</ItemTemplate>
public void GetClasses()
{
DataSet ds = CatalogDALC.GetClassesByCategory(categoryID, DateTime.Now);
classesList.DataSource = ds;
classesList.DataBind();
// Set main category header for classes - loop here and set category name headers
int count = 0;
foreach (ListViewDataItem item in classesList.Items)
{
Label categoryNameLabel = item.FindControl("categoryNameLabel") as Label;
if (count == 0) // Set the first category name header regardless
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
else
{
if (ds.Tables[0].Rows[count-1]["cat_name"].ToString() != ds.Tables[0].Rows[count]["cat_name"].ToString())
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
}
count++;
}
}
Related
I am working on an ASP.NET VB.NET web form - a reservation web application, in which only one aspx page and rest are user-control page.
At run-time of aspx page, user controls load as per step and name define in db, like in below link.
ASP.NET Custom user control to add dynamically
In the first step, the first user-control is bind in page-init which is used to shows reservation availability detail in .NET datalist control like (see images).
All the details are bind to generate run-time control via data-list's item_databound event.
ImageOfRoom (asp.net Image Control) - on click popup will open with scroll functionality
Name (direct databound)
Amenities (icon(s)) - dynamically add from db.
No. of room as per room type (asp.net dropdown control) - dynamically add from db and on selected index changed, need another dropdown bind in same row and on change of adult dropdown price will vary.
Total price (direct databound)
Book now (button)
Now issue is whenever any event of datalist(click on romm-image or dropdown selected index changed) fired, the dynamic control remove like ammenities, dynamic dropdown of other row etc.
What I tried as :- ispostback, relevant event of page-life cycle, ajax-jquery, viewstate.
I checked this also, But no luck. :
Dynamically added controls in Asp.Net
I analyze that, the user-control is always rebound and then event fired, but no datalist rebind and thus no - databound event fire and finally dynamic control is removed. If you wish, I will share the code too (but its huge code).
So question is how to retain the dynamic controls and its value when dropdown selected index changed or image click event fired in datalist in usercontrol?
I am not used update-panel, does that work? If yes, then please give sample data.
Good to answer with sample data. Even please suggest that if possible via any other control like grid-view or else, then I ready to change it.
Updated
This is my code
Load User Control code
In aspx page, usercontrol define to load another user control as per current step. This “uc” user control tag in aspx page.
<div id="divPlaceholder" runat="server">
<uc:DynamicControlHost ID="ucDynamicControlHost" runat="server" />
</div>
In page_load as well as page_prerender( ispostback ) , the below code execute to load runtime user-control.
public Control SetUserControlPath(string path)
{
Control c = null;
if (this.dynamicAllContent.Controls.Count > 0)
{
//Check that the new control is not the same as the current control
if (!this.UserControlPath.Equals(path))
{
//Remove the old item because we can not simply replace them!
this.dynamicPHAllContent.Controls.Clear();
c = Page.LoadControl(path + ".ascx");
c.ID = path;
//Add New Item
this.dynamicAllContent.Controls.Add(c);
lock (_userControlLockObject)
{
//Store the new path
_strUserControl = path;
}
}
}
else
{
c = Page.LoadControl(path + ".ascx");
c.ID = path;
this.dynamicAllContent.Controls.Add(c);
_strUserControl = path;
}
return c;
}
Structure of datalist in usercontrol
<asp:UpdatePanel ID="EmployeesUpdatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DataList ID="dlLodgingAvailableDetails" ShowHeader="true" OnSelectedIndexChanged="dlLodgingAvailableDetails_SelectedIndexChanged" runat="server" CellPadding="2" CellSpacing="2" BorderWidth="1px" BorderColor="Black"
OnItemDataBound="dlLodgingAvailableDetails_ItemDataBound" BorderStyle="Solid" GridLines="Horizontal" HorizontalAlign="Justify">
<HeaderStyle CssClass="submit_butt"></HeaderStyle>
<HeaderTemplate>
Lodging Item Type Details
<asp:Button ID="btnBookRoom" runat="server" Text="Book Rooms" CssClass="submit_butt" OnClick="btnBookRoom_Click" />
</HeaderTemplate>
<ItemTemplate>
<table cellpadding="2" cellspacing="0" border="1" style="width: 100%";>
<tr>
<td style="width:170px">
<asp:ImageButton ID="imgLodging" OnClick="imgLodging_Click" commandargument='<%# Eval("ItemTypeId") %>'
runat="server" ImageUrl='<%# Eval("Photo") %>' Width="150px" Height="120px" />
</td>
<td style="width:180px">
<b>Name</b><br />
<span><%# Eval("ItemTypeName") %></span><br />
<b>Occupancy</b> <span><%# Eval("Occupancy") %></span>
<br />
<asp:panel ID="placeholderAmmenities" runat="server" Visible="True" ></asp:panel>
</td>
<td style="width:100px">
<b>Room</b><br />
<asp:hiddenfield runat="server" ID="hdnItemTypeId" Value='<%# Eval("LodgingItemTypeId") %>' />
<asp:DropDownList ID="ddlAvailable" runat="server"
AppendDataBoundItems="True" SelectedValue='<%# Bind("LodgingReservationsAvailable") %>' >
<asp:ListItem Value="0" Text="0"/>
<asp:ListItem Value="1" Text="1"/>
<asp:ListItem Value="2" Text="2"/>
</asp:DropDownList>
</td>
<td>
</td>
<td style="width:100px">
<div id="dvadult" runat="server"></div>
<asp:placeholder runat="server" ID="PlaceHolderAdult" ViewStateMode="Enabled" EnableTheming="False" Visible="True" ></asp:placeholder>
</td>
<td style="width:50px">
<asp:Label runat="server" ID="lblnumbernight" ></asp:Label>
</td>
<td style="width:50px">
<asp:placeholder ID="placeholderPrice" runat="server" Visible="True"></asp:placeholder>
</td>
<td style="width:50px">
<b>Total</b><br />
<asp:Label runat="server" ID="lblTotalAmount" ></asp:Label>
</td>
<td style="width:100px">
<asp:Button ID="btnBookRoom" runat="server" Text="Book Rooms" CssClass="submit_butt" />
</td>
</tr>
</table>
</ItemTemplate>
<SeparatorStyle BackColor="Lime" Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" HorizontalAlign="Center" />
</asp:DataList>
</ContentTemplate>
</asp:UpdatePanel>
Datalist item data bound event code (its inside image binding , price related field add and also creating the dynamic control as per the condition)
protected void dlLodgingAvailableDetails_ItemDataBound(object sender, DataListItemEventArgs e)
{
try
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Image img = e.Item.FindControl("imgLodging") as Image;
if (img != null)
{
string bytesval = ((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[3].ToString();
if (string.IsNullOrWhiteSpace(bytesval)) return;
byte[] bytes = (byte[])((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[3];
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
img.ImageUrl = "data:image/png;base64," + base64String;
}
DropDownList ddlList = e.Item.FindControl("ddlAvailable") as DropDownList;
Label lbldipositamount = e.Item.FindControl("lblTotalAmount") as Label;
Label lblnumbernight = e.Item.FindControl("lblnumbernight") as Label;
var PlaceHolderAmmenities = e.Item.FindControl("placeholderAmmenities") as Panel;
ddlList.Attributes.Add("onchange", " openLodgingNumber1(this,'" + ddlList.SelectedValue + "');");
int? LodgingItemTypeId = Convert.ToInt32(((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[1]);
DataSet ds = new DataSet();
ds = LodgingData.SelectLodgingItemTypeAmenityDateSet(LodgingItemTypeId);
DataTable dt = new DataTable();
if (ds != null)
{
dt = ds.Tables[0];
if (dt.Rows.Count > 0)
{
for (int j = 0; j < dt.Rows.Count; j++)
{
Image image = new Image();
image.ID = "imgAmmenities" + j + DateTime.Now.ToString();
string bytesval = dt.Rows[j]["AmenityIcon"].ToString(); //((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[4].ToStrin();
//if (string.IsNullOrWhiteSpace(bytesval)) return;
if (bytesval != string.Empty)
{
byte[] bytes = (byte[])dt.Rows[j]["AmenityIcon"];
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
image.ImageUrl = "data:image/png;base64," + base64String;
image.Height = 20;
image.Width = 20;
image.EnableViewState = true;
PlaceHolderAmmenities.Controls.Add(image);
PlaceHolderAmmenities.Controls.Add(new LiteralControl(" "));
}
}
}
}
decimal PriceTotal = 0;
var PlaceHolderPrice = e.Item.FindControl("placeholderPrice") as PlaceHolder;
DataSet dsprice = new DataSet();
dsprice = LodgingData.SelectLodgingItemTypePrice(LodgingItemTypeId);
if (dsprice != null)
{
DataTable dtprice = new DataTable();
dtprice = dsprice.Tables[0];
if (dtprice.Rows.Count > 0)
{
DateTime fromdate = Convert.ToDateTime(txtFromDate.Text);
DateTime todate = Convert.ToDateTime(txtToDate.Text);
double daterange = ((todate - fromdate).TotalDays + 1);
lblnumbernight.Text = daterange.ToString();
//for (DateTime date = fromdate; date >= todate; date.AddDays(1))
for (int d = 0; d < Convert.ToInt32(daterange); d++ )
{
DateTime date = fromdate.AddDays(d);
//DataView dv = new DataView(dtprice);
DataTable dtprice1 = new DataTable();
DataRow[] rows = dtprice.Select("#" + date + "# >= PriceStartDate AND" + "#" + date + "# <= PriceEndDate");
if (rows.Length > 0)
{
dtprice1 = rows.CopyToDataTable();
}
if (dtprice1.Rows.Count > 0)
{
for (int j = 0; j < dtprice1.Rows.Count; j++)
{
Label lbl = new Label();
string dayofweek = dtprice1.Rows[j]["DayOfWeekId"].ToString();
if (dayofweek.Trim() == eDayOfWeek.All.ToString().Trim())
{
lbl.ID = "lbl" + j;
lbl.Text = dtprice1.Rows[j]["Price"].ToString();
PriceTotal += Convert.ToDecimal(dtprice1.Rows[j]["Price"]);
PlaceHolderPrice.Controls.Add(lbl);
PlaceHolderPrice.Controls.Add(new LiteralControl("<br />"));
}
else if (Convert.ToInt32(dayofweek) == Convert.ToInt32(date.DayOfWeek + 1))
{
lbl.ID = "lbl" + j;
lbl.Text = dtprice1.Rows[j]["Price"].ToString();
PriceTotal += Convert.ToDecimal(dtprice1.Rows[j]["Price"]);
PlaceHolderPrice.Controls.Add(lbl);
PlaceHolderPrice.Controls.Add(new LiteralControl("<br />"));
}
}
}
else
{
DataView dv1 = new DataView(dtprice);
dv1.RowFilter = "PriceStartDate IS NULL OR PriceEndDate IS NULL";
//dv1.RowFilter = "PriceStartDate == null and PriceEndDate == null";
DataTable dtprice2 = new DataTable();
dtprice2 = dv1.ToTable();
for (int j = 0; j < dtprice2.Rows.Count; j++)
{
Label lbl = new Label();
string dayofweek = dtprice2.Rows[j]["DayOfWeekId"].ToString();
if (dayofweek.Trim() == eDayOfWeek.All.ToString().Trim())
{
lbl.ID = "lbl" + j;
lbl.Text = dtprice2.Rows[j]["Price"].ToString();
PriceTotal += Convert.ToDecimal(dtprice2.Rows[j]["Price"]);
PlaceHolderPrice.Controls.Add(lbl);
PlaceHolderPrice.Controls.Add(new LiteralControl("<br />"));
}
else if (Convert.ToInt32(dayofweek) == Convert.ToInt32(date.DayOfWeek + 1))
{
lbl.ID = "lbl" + j;
lbl.Text = dtprice2.Rows[j]["Price"].ToString();
PriceTotal += Convert.ToDecimal(dtprice2.Rows[j]["Price"]);
PlaceHolderPrice.Controls.Add(lbl);
PlaceHolderPrice.Controls.Add(new LiteralControl("<br />"));
}
}
}
}
}
}
lbldipositamount.Text = PriceTotal.ToString();
// var amount = ((System.Data.DataRowView)(e.Item.DataItem)).Row.ItemArray[3];
int selectedvalue = Convert.ToInt32(ddlList.SelectedItem.Text);
if (selectedvalue != 0)
{
double totalamount = selectedvalue * Convert.ToDouble(PriceTotal);
lbldipositamount.Text = totalamount.ToString();
}
}
}
catch (Exception)
{
throw;
}
}
On dynamically genereted dropdown selection event fired
In above even add this dropdown dynamically, now when this control's event is called , further dynamic control is adding as per the condition.
Issue is this event remove the dynamic other control as well even for other row of the previous selection is hidden or lost , so we retain the dynamic control in any post back and event fire.
protected void ddlAvailable_SelectedIndexChanged(object sender, EventArgs e)
{
// if (UserControlTextBoxChanged != null) dlLodgingAvailableDetails_ItemDataBound(sender, e);
//dlLodgingAvailableDetails.ItemDataBound += new DataListItemEventHandler(dlLodgingAvailableDetails_ItemDataBound);
double amount = 0;
var ddlList = (DropDownList)sender;
var row = (DataListItem)ddlList.NamingContainer;
//get the Id of the row
DataSet ds = new DataSet();
int? Id = Convert.ToInt32(((HiddenField)row.FindControl("hdnItemTypeId")).Value);
double? tamount = Convert.ToDouble(((Label)row.FindControl("lblTotalAmount")).Text);
int? groupid = Convert.ToInt32(ddlLodgingGroup.SelectedValue);
int selectedvalue = Convert.ToInt32(ddlList.SelectedItem.Text);
DateTime? startdate = Convert.ToDateTime(txtFromDate.Text);
DateTime? enddate = Convert.ToDateTime(txtToDate.Text);
ds = LodgingData.SelectLodgingItemTypeDataSet(startdate, enddate, groupid);
DataTable dt = new DataTable();
DataView dv = new DataView();
if (ds != null)
{
dt = ds.Tables[0];
dv = dt.DefaultView;
dv.RowFilter = "LodgingItemTypeId=" + Id;
}
dt = dv.ToTable();
if (dt.Rows.Count > 0)
{
if (tamount != null)
{
amount = Convert.ToDouble(tamount);
}
}
//amount = Convert.ToDouble(((Label)row.FindControl("lblTotalAmount")).Text);
var PlaceHolder1 = ((PlaceHolder)row.FindControl("PlaceHolderAdult"));
double totalamount = 0;
if (selectedvalue != 0)
{
totalamount = selectedvalue * Convert.ToDouble(amount);
((Label)row.FindControl("lblTotalAmount")).Text = totalamount.ToString();
Label lblAdult = new Label();
lblAdult.ID = "lblAdult";
lblAdult.Text = "Adult";
lblAdult.Font.Bold = true;
PlaceHolder1.Controls.Add(lblAdult);
PlaceHolder1.Controls.Add(new LiteralControl("<br />"));
}
else
{
totalamount = amount;
}
for (int j = 0; j < selectedvalue; j++)
{
DropDownList ComboBox = new DropDownList();
ComboBox.ID = "ComboBox" + j;
ComboBox.AutoPostBack = false;
ComboBox.Attributes.Add("runat", "server");
ComboBox.Items.Add(new ListItem("0", "0"));
ComboBox.Items.Add(new ListItem("1", "1"));
ComboBox.Items.Add(new ListItem("2", "2"));
ComboBox.SelectedIndexChanged += new EventHandler(Dynamic_Method);
PlaceHolder1.Controls.Add(ComboBox);
PlaceHolder1.Controls.Add(new LiteralControl("<br />"));
}
}
I'm not sure how much this will solve for you, but here is an example of preserving a row of data in a gridview with a templatefield containing a dynamically generated dropdownlist
I broke the process into 2 parts
1) Save data currently in Gridview to a session variable
2) Recreate, source, and bind controls
Here's saving the values in the gridview. I use a recursive find control formula I found on this site (but don't remember from where) because my controls are generated and placed inside the gridview row without unique names. For ex. the tbxA that exists in row 1 is different than the tbxA in row 2. This may not apply to you - the key is to find all controls you want to save the values of.
Private Sub SaveValues()
Dim savedTable As New DataTable
savedTable.Columns.Add(New DataColumn("A"))
For i = 0 To GridView1.Rows.Count - 1
Dim existing(0) As Object
existing(0) = TryCast(FindControlRecursive(GridView1.Rows(i), "ddlA"), DropDownList).SelectedValue
savedTable.Rows.Add(existing)
Next
Session("GhostTable") = savedTable
End Sub
Then in Page_Load under(when it IS a postback) set the gridview datasource to the session variable, and databind it. This will trigger the following code for every row:
Keep in mind I also have the datasource of the dropdown list stored in a session variable on page load. This allows the datasource and databind to occur for the dropdown every time it is generated.
Protected Sub OnRowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
'Handles databinding of each gridview1 row ddl to gridview templatefield
If e.Row.RowType = DataControlRowType.DataRow Then
Dim ddlA As New DropDownList()
ddlA.DataSource = Session("lengthList")
ddlA.DataBind()
ddlA.ID = "ddlA"
ddlA.SelectedValue = TryCast(e.Row.DataItem, DataRowView).Row.Item("A").ToString()
e.Row.Cells(1).Controls.Add(ddlA)
End if
End Sub
The ddlA.SelectedValue = TryCast(e.Row.DataItem, DataRowView).Row.Item("A").ToString() is what preserves the data after any postback. It determines which row is being bound, and then repopulates the control with whatever it previously was.
Hope this helps!
To make sure that the gridview is populated every time, call SaveValues in your event handlers.
Protected Sub ddlEmpNumber_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlEmpNumber.SelectedIndexChanged
'Do whatever on selected index change, then the following:
Call SaveValues()
GridView1.DataSource = Session("GhostTable")
GridView1.DataBind()
End Sub
Do it all in the page_init
You're wiring up the eventhandler in the ASP part like this:
<asp:DataList ID ... OnSelectedIndexChanged="dlLodgingAvailableDetails_SelectedIndexChanged" ...
and then in code of the handler attempting to re-wire the other ones:
ComboBox.SelectedIndexChanged += new EventHandler(Dynamic_Method);
Any time you do dynamic stuff on a webforms page, all setup including event handler wireup must be in the page_init. When events run, re-wiring won't work. For what you're doing (asp: ... and during a method call), it's ending up in the wrong part of the lifecycle and the right things aren't there to either add the javascript to call doPostback, or if that runs the __eventargs, etc. have data for controls that aren't built yet (event postbacks are checked for AFTER page init so you have to create the controls before that check) and therefore get ignored.
Note - probably you know this but you have to give controls unique IDs, generally can by done if you have a numeric primary key by just appending to the datarows. (might have to do this manually to child controls in user control, have had to do this with usercontrols in page_init, hopefully you won't)
I work on a big app that dynamically builds every screen in webforms (from a UI generator) in the page-init. All work is done in events, they work like a charm! Page_load is basically empty. Get to know the asp page lifecycle - it's a booger but easier than rewriting your app in HotTowel (although think about that the next app ;-)
Pretty good diagram: http://blogs.msdn.com/b/aspnetue/archive/2010/01/14/asp-net-page-life-cycle-diagram.aspx
Good luck!
I have done every thing as above suggested and other google search site too. But it refresh the data and every time it rebind all dynamic object in the grid.
Finally I have done every thing based on javascript and jquery, without that dynamic control always rebind which I don't want. So any body who are stuck in this situation forgot to r and d and work with javascript/ webmethod with dynamic controls.
Thank all who given an answer
I use a performCallback to add a new item to my ASPxCombo on serverside, and want to change my index to that new item on the client side. I use DevExpress onEndCallback to do this and it is working great if my index is <= 99. Above that the index is not changed.
Do anybody no if DevExpress's SetSelectedIndex() method works with index greater than this, seems a little strange to me.
<dx:ASPxComboBox runat="server"
ID="CmbManufacturer"
ClientInstanceName="cmbManufacturer"
CssClass="dxeButtonEdit_LWDisplayEdit_CustomDropDown"
DropDownStyle="DropDownList"
EnableCallbackMode="True"
OnCallback="CmbManufacturer_Callback"
ValueType="System.String"
FieldName="ID"
TextFormatString="{0}"
FilterBy="Name"
TextField="Name"
ValueField="ID"
EnableSynchronization="False"
AllowEdit="false"
ValidationSettings-Display="None"
AutoPostBack="False"
Visible="False"
Width="400" >
<ClientSideEvents SelectedIndexChanged="function(s,e) {OnManufacturerChanged(s,e); }"
Init="function(s,e) {LwValidating2(s,e);}"
EndCallback="function(s,e) { OnEndCallbackCmbManufacturer(s,e); }"/>
</dx:ASPxComboBox>
function OnEndCallbackCmbManufacturer(s, e) {
var index = s.cpSelectedIndex;
s.SetSelectedIndex(index);
OnManufacturerChanged(s, e);
}
I have solved the problem by moving my new Item in dropdownItemList up in front of list below CallbackpageSize. Then i can change index on combo to the Items new index.
protected void CmbManufacturer_Callback(object source, CallbackEventArgsBase e)
{
var manufacturerName = e.Parameter.Trim();
// need to move item to top of list because it must be lower than CallbackPagesize to work
int indexforNewItem = 1;
try
{
int newManufacturerId = SoftwareManufacturer.Update(-1, manufacturerName, "");
LoadDropDownBoxManufacturer(null);
int newManufacturerIndex = CmbManufacturer.Items.IndexOfText(manufacturerName);
CmbManufacturer.Items.Move(newManufacturerIndex, indexforNewItem);
CmbManufacturer.JSProperties["cpSelectedIndex"] = indexforNewItem;
}
catch ()
{
}
}
Here is my requirement.
I had 3 groups and having set of emplyees under each group.
So, I had placed 3 labels(To display groupname) 3 gridviews(to dispalay set of employees from each group) in a DataList. all the rows in 3 GridViews having RadioButtons.
Now problem is RadioButton is behaving like a checkbox, it is allowing multiple selections.
But, I need to select Only one RADIOBUTTON among all 3 Gridviews. How this can be acheived. Can Someone here help me?
/********* Displaying Group Name and Its set of employes **********/
/*** This loop will execute 3 times as I had 3 groups. ****/
protected void dlGraphItemDataBound(object sender, DataListItemEventArgs e)
{
MyList dataitem = (MyList)e.Item.DataItem;
if (dataitem != null)
{
Label lbl = (Label)e.Item.FindControl("lblMyLabel");
lbl.Text = dataitem.GroupName;
GridView dg = (GridView)e.Item.FindControl("gvList");
if (dg != null)
{
List< MyList > groupItem = new List< MyList >(); // List of Employees
foreach (MyList item in _empList)
{
if (item.GroupName.Equals(dataitem.GroupName))
groupItem.Add(item); // Grouping all the emps who had same groupname
}
SetupReportGrid(dg); // Method to add controls to gridview dynamically
dg.SetDataSource(groupItem); //Setting datasource for gridview
}
}
}
protected void onRadioButtonClicked(object sender, EventArgs e)
{
foreach (DataListItem dlItem in dlMyDataList.Items)
{
GridView grid = (GridView) dlItem.FindControl("gvList");
if (grid != null)
{
RadioButton selectButton = (RadioButton) sender;
GridViewRow row = (GridViewRow) selectButton.NamingContainer;
int a = row.RowIndex;
foreach (GridViewRow gridRow in grid.Rows)
{
RadioButton rd = gridRow.FindControl("rdoSelect") as RadioButton;
if (rd.Checked)
{
if (gridRow.RowIndex == a)
{
rd.Checked = true;
}
else
{
rd.Checked = false;
}
}
}
}
}
This is how i tried.... when i select first and second radiobutton in 1st gridview and after the event for 2nd radiobutton both 1st and 2nd radiobuttons got unchecked. As the loop executes for all gridviews and last grid having no radiobuttons checked. finally my code results as no radiobuttons checked
Grid View Mark up:
<asp:DataList ID="dlMyDataList" runat="server" OnItemDataBound="dlGraphItemDataBound">
<ItemTemplate>
<table cellspacing="0" width="100%" >
<tr>
<td nowrap="nowrap" width="100%" align="left" valign="middle">
<asp:Label ID="lblGroupName" runat="server" CssClass="ssrptsublabel" > </asp:Label>
</td>
</tr>
<tr>
<td width="100%" nowrap="nowrap" align="left" valign="middle">
<asp:Panel id="pnlReport" runat="server" BorderWidth="0" Width="100%" Wrap="False">
<commoncontrols:MyGridView id="gvList" runat="server" autogeneratecolumns="false" EnableViewState="True">
</commoncontrols:MyGridViewview>
</asp:Panel>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
**// Assigning controls dynamically to grid view
// Having Seperate customized class for gridview, based on that we are adding controls
//
GridViewColumnControl(ControlTypes, Control_ID, CSS Style, 0, databind,"" );**
private void SetupGrid(GridView grid)
{
IList<GridViewColumn> columns = new List<GridViewColumn>();
GridViewColumn gridColumn = new GridViewColumn(ColumnTypes.TemplateColumn, "", 500, HorizontalAlign.Left,null);
GridViewColumnControl control = new GridViewColumnControl(ControlTypes.RadioButton, "rdoSelect", "labelstyle", 0, null, "");
control.Visible = false;
control.AutoPostBack = true;
control.OnChanged += onRadioButtonClicked;
gridColumn.AddControl(control);
control = new GridViewColumnControl(ControlTypes.DropDown, "", "style", 0, null, "");
control.Visible = false;
gridColumn.AddControl(control);
grid.SetColumns(columns);
}
The RadioButton control has a property called GroupName. All radio buttons having the same GroupName belong to the same group. In each radio button group only one radio button can be seleted. So I believe that if you set this property for all radio buttons in the grid views, you will fulfill your requirement.
I have the following repeater inside an ASCX file:
<asp:Repeater ID="repeater1" runat="server">
<HeaderTemplate>
<ul class="formList">
</HeaderTemplate>
<ItemTemplate>
<li><a href="plugins/umbracocontour/editForm.aspx?guid=<%# ((Umbraco.Forms.Core.Form)Container.DataItem).Id %>"
class="form">
<%# ((Umbraco.Forms.Core.Form)Container.DataItem).Name %></a> <small><a href="plugins/umbracocontour/editForm.aspx?guid=<%# ((Umbraco.Forms.Core.Form)Container.DataItem).Id %>">
Open form designer</a> <a href="plugins/umbracocontour/editFormEntries.aspx?guid=<%# ((Umbraco.Forms.Core.Form)Container.DataItem).Id %>">
View entries</a> </small></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
It is populated with data via a method named ShowAllForms()
private void ShowAllForms()
{
using (var formStorage = new FormStorage())
{
var list = formStorage.GetAllForms(false).OrderBy(f => f.Name).Where(form => Security.HasAccessToForm(form.Id)).ToList();
this.repeater1.DataSource = list;
this.repeater1.DataBind();
if (list.Count == 0)
{
this.paneBrowse.Visible = false;
}
}
}
and `SearchForms:
private void SearchForms()
{
var forms =
this.formRepository.GetFormByFreeText(this.txtFormSearch.Text).Where(form => Security.HasAccessToForm(form.Id)).
ToList();
this.repeater1.DataSource = forms;
this.repeater1.DataBind();
}
ShowAllForms() is called in Page_Load, if there has not been a postback, and also in the click event for the "Show All Forms" button. SearchForms() is called in the postback for the "Search Forms" button.
As a non-admin user, when I view the list of forms I see a whole bunch of them initially. I then search for a form via it's name which should return no items. So far so good. I then click the "Show All Forms" button which will execute ShowAllForms(), which is what was called to show all the forms in the first place.
However, when called a second time, ShowAllForms() does not show any form data in the repeater. To clarify, I can see that there are items returned in the forms variable, so the collection is not empty, and yet none of those items appear in the repeater.
I'm puzzled as to what could be going on here.
EDIT:
OnLoad event for the page:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.ShowAllForms();
}
}
OnInit:
protected void Page_Init(object sender, EventArgs e)
{
this.formRepository = TinyIoC.TinyIoCContainer.Current.Resolve<IFormRepository>();
}
I believe the problem is here:
if (list.Count == 0)
{
this.paneBrowse.Visible = false;
}
I don't see where you set paneBrowse's visiblity to true again.
A quick fix would be:
this.paneBrowse.Visible == (list.Count > 0);
I want to bind Label to a Property of a Generic list inside Container.DataItem .
Here I am receiving a List in Container.DataItem want to go inside this Container.DataItem containing List.
Aspx code
<asp:Label ID="Label1" runat="server" Text='<%# Container.DataBind %>'></asp:Label>
Output :
System.Collection.Generic.List'1[Sizes]
C# Code :
List<List<Sizes>> Combosizes =new List<List<Sizes>>();
foreach (var i in skuIdsList)
{
var Sizes_list = (from item in sizes
where item.SkuId == i.skuid
select new Sizes
{
skusizeid = item.SkuSizeId,
sizevalue = item.Sizevalue
}).ToList();
Combosizes.Add(Sizes_list);
}
DataList3.DataSource = Combosizes;
DataList3.DataBind();
This is I have bind the List> to DataList3. And I am trying to bind the label inside the DataList3 with the first index of List of List.
Is there any solution.??
List<List<Sizes>> Combosizes =new List<List<Sizes>>();
foreach (var i in skuIdsList)
{
var Sizes_list = (from item in sizes
where item.SkuId == i.skuid
select new Sizes
{
skusizeid = item.SkuSizeId,
sizevalue = item.Sizevalue,
description = item.Description
}).ToList();
Combosizes.Add(Sizes_list);
}
DataList3.DataSource = Combosizes;
DataList3.DataBind();
You can bind value to the label at datalist item databound Event.
protected void DataList3_ItemDataBound(object sender, DataListItemEventArgs e)
{
var des = (List<Sizes>)(e.Item.DataItem);
Label lblsize = e.Item.FindControl("lblsize") as Label;
lblsize.Text = des.First().description;
}