 |
|
 |
Thank you for the useful DropDownAdapter class, I am able to use it easy. Now, I want to turn this adapter into a ListBox. I changed the class to use:
ListBox list = this.Control as ListBox;
But, the label is not showing. What else do I need to do in the class to make it work for ListBox? FYI. I want to use the ListBox instead of DropDown because I want to have the multiple selection capabilities. Wanting to have the abilities to have "Select All" per group.
Thank you.
|
|
|
|
 |
|
 |
Hello,
I'm getting a event validation error when use your code. Is there any way to get around this other that turning event validation off?
Thanks! Ken
|
|
|
|
 |
|
 |
HI , My Application is Running in D:/VSS Applicatiom/BulkSMS
I saved .CS file in App_Data Folder
now it giving me Error 52 Could not load type 'VSS Application.BulkSMS.App_Code.Adapters.DropDownListAdapter'. (D:\VSS Application\BulkSMS\App_Browsers\BrowserFile.browser line 4)
What should be the path fro "adapterType" in browser file
Plz Help me
|
|
|
|
 |
|
 |
*****PLACE CLASS in App_Code.*****
Imports Microsoft.VisualBasic Imports System Imports System.Data Imports System.Configuration Imports System.Web Imports System.Web.Security Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Web.UI.WebControls.WebParts Imports System.Web.UI.HtmlControls Imports System.Collections Imports System.Collections.Generic Namespace MyGUI.Adapters Public Class DropDownListAdapter Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter
Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter) Dim list As DropDownList = Me.Control Dim currentOptionGroup As String = "" Dim renderedOptionGroups As New Collection
For Each item As ListItem In list.Items If item.Attributes("OptionGroup") = "" Then RenderListItem(item, writer) Else If currentOptionGroup <> item.Attributes("OptionGroup") Then If currentOptionGroup <> "" Then RenderOptionGroupEndTag(writer) End If currentOptionGroup = item.Attributes("OptionGroup") RenderOptionGroupBeginTag(currentOptionGroup, writer) End If RenderListItem(item, writer)
End If
Next If currentOptionGroup <> "" Then RenderOptionGroupEndTag(writer) End If End Sub
Private Sub RenderListItem(ByVal item As ListItem, ByVal writer As HtmlTextWriter) writer.WriteBeginTag("option") writer.WriteAttribute("value", item.Value, True) If (item.Selected) Then writer.WriteAttribute("selected", "selected", False) For Each key As String In item.Attributes.Keys writer.WriteAttribute(key, item.Attributes(key).ToString) Next writer.Write(HtmlTextWriter.TagRightChar) HttpUtility.HtmlEncode(item.Text, writer) writer.WriteEndTag("option") writer.WriteLine() End Sub
Private Sub RenderOptionGroupBeginTag(ByVal name As String, ByVal writer As HtmlTextWriter) writer.WriteBeginTag("optgroup") writer.WriteAttribute("label", name) writer.Write(HtmlTextWriter.TagRightChar) writer.WriteLine() End Sub
Private Sub RenderOptionGroupEndTag(ByVal writer As HtmlTextWriter) writer.WriteEndTag("optgroup") writer.WriteLine() End Sub
End Class
End Namespace
BROWSER FILE
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.DropDownList" adapterType="MyGUI.Adapters.DropDownListAdapter" /> </controlAdapters> </browser> </browsers>
|
|
|
|
 |
|
 |
Hello, I'm trying to use your code in an Web Project of VS2008 but I'm not able to find a way to do it. What is not clear, for me that I'm newbe, where I've to put the Adpater Code. Can you help me? Thanks Massimo
|
|
|
|
 |
|
 |
Hi,
It's pretty straight forward and has nothing to do with the version of the IDE you're using. All you need to do is as follows:
1.) Create a class somewhere containing your control adapter. I use /Code/Adapters for this, but you could put it anywhere. Note, this is not the App_Code folder, which is not used in web application projects.
2.) Add a browsers file to the special App_Browsers folder. If you dont already have this folder, you can add it by right clicking the project, then choose 'Add' then 'Add ASP.NET Folder', you'll see it in the list. You may choose what to name your file, but it must have the extension .browser
I generally keep the default BrowserFile.browser filename.
3.) In that file, you need to add some xml code, which tells the runtime to use your adapter when rendering the control. This code will look as follows:
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.AdRotator" adapterType="My.Namespace.Project.Code.Adapters.AdRotatorAdaptor" /> </controlAdapters> </browser> </browsers>
That should do it. If you still struggle to get it working, there are many examples on control adapters out there, just Google away, you'll find something.
|
|
|
|
 |
|
 |
Thanks, your suggestion has been perfect. Now everything works fine!
Massimo

|
|
|
|
 |
|
 |
Hi,
Is there any way so that we can set the style of the optgroup label to another appeareace, like normal text, italic, forecolor etc.
Thanks
|
|
|
|
 |
|
 |
Add some CSS!
optgroup { color:Red; } option {color: Black;}
|
|
|
|
 |
|
 |
i try to do this with u'r code:
---Choose --- Group1 --Item1 --Item2 ItemWithoutGroup Group2 --Item4 --Item4
in u'r code if thegroup item we put :
ListItem item6 = new ListItem("Allosaurus", "6"); item6.Attributes["OptionGroup"] = "Dinosaurs";
and then i add the item without group after that line with this code only
ListItem item7 = new ListItem("Trex", "7");
it still assume the item7 also in the previous group.
modified on Wednesday, September 17, 2008 5:13 AM
|
|
|
|
 |
|
 |
Did anyone find a possible solution for mixing ungrouped items?
|
|
|
|
 |
|
 |
I am using this adapter for listbox. Everything works fine except that optgroup structure disappears after PostBack. When I used following two functions for saving and loading viewstate it gives me error CS0115: 'ListAdapter.ListBoxAdapter.SaveViewState()': no suitable method found to override
The code I added for saving and loading viewstate is: protected override object SaveViewState() { // Create an object array with one element for the CheckBoxList's // ViewState contents, and one element for each ListItem in skmCheckBoxList object[] state = new object[this.Items.Count + 1];
object baseState = base.SaveViewState(); state[0] = baseState;
// Now, see if we even need to save the view state bool itemHasAttributes = false; for (int i = 0; i < this.Items.Count; i++) { if (this.Items[i].Attributes.Count > 0) { itemHasAttributes = true;
// Create an array of the item's Attribute's keys and values object[] attribKV = new object[this.Items[i].Attributes.Count * 2]; int k = 0; foreach (string key in this.Items[i].Attributes.Keys) { attribKV[k++] = key; attribKV[k++] = this.Items[i].Attributes[key]; }
state[i + 1] = attribKV; } }
// return either baseState or state, depending on whether or not // any ListItems had attributes if (itemHasAttributes) return state; else return baseState; }
protected override void LoadViewState(object savedState) { if (savedState == null) return;
// see if savedState is an object or object array if (savedState is object[]) { // we have an array of items with attributes object[] state = (object[])savedState; base.LoadViewState(state[0]); // load the base state
for (int i = 1; i < state.Length; i++) { if (state[i] != null) { // Load back in the attributes object[] attribKV = (object[])state[i]; for (int k = 0; k < attribKV.Length; k += 2) this.Items[i - 1].Attributes.Add(attribKV[k].ToString(), attribKV[k + 1].ToString()); } } } else // we have just the base state base.LoadViewState(savedState); }
Is there any complete solution for this?
|
|
|
|
 |
|
 |
First I have to thank the author for this post. It has helped me a lot in getting this to work. I thought I'd make a contribution to this code to make PastBacks work correctly.
public class DropDownListAdapter : System.Web.UI.WebControls.Adapters.WebControlAdapter {
public static readonly string OPTGROUPATTR = "OptionGroup";
Dictionary<string, string> optionGroups = new Dictionary<string, string>();
protected override void RenderContents(HtmlTextWriter writer) { DropDownList list = this.Control as DropDownList;
string currentOptionGroup; List<string> renderedOptionGroups = new List<string>();
foreach(ListItem item in list.Items) { string keyString = item.Value + item.Text; if(item.Attributes[OPTGROUPATTR] == null && !optionGroups.ContainsKey(keyString)) { RenderListItem(item, writer); } else { if (item.Attributes[OPTGROUPATTR] != null) currentOptionGroup = item.Attributes[OPTGROUPATTR]; else { currentOptionGroup = optionGroups[keyString]; }
if(renderedOptionGroups.Contains(currentOptionGroup)) { RenderListItem(item, writer); } else { if(renderedOptionGroups.Count > 0) { RenderOptionGroupEndTag(writer); }
RenderOptionGroupBeginTag(currentOptionGroup, writer); renderedOptionGroups.Add(currentOptionGroup);
RenderListItem(item, writer); } } }
if(renderedOptionGroups.Count > 0) { RenderOptionGroupEndTag(writer); } }
private void RenderOptionGroupBeginTag(string name, HtmlTextWriter writer) { writer.WriteBeginTag("optgroup"); writer.WriteAttribute("label", name); writer.Write(HtmlTextWriter.TagRightChar); writer.WriteLine(); }
private void RenderOptionGroupEndTag(HtmlTextWriter writer) { writer.WriteEndTag("optgroup"); writer.WriteLine(); }
private void RenderListItem(ListItem item, HtmlTextWriter writer) {
this.Page.ClientScript.RegisterForEventValidation(this.Control.UniqueID, item.Value);
writer.WriteBeginTag("option"); writer.WriteAttribute("value", item.Value, true);
if(item.Selected) { writer.WriteAttribute("selected", "selected", false); }
foreach(string key in item.Attributes.Keys) { writer.WriteAttribute(key, item.Attributes[key]); }
writer.Write(HtmlTextWriter.TagRightChar); HttpUtility.HtmlEncode(item.Text, writer); writer.WriteEndTag("option"); writer.WriteLine(); }
protected override object SaveAdapterViewState() { DropDownList list = this.Control as DropDownList; string currentOptionGroup; string keyString;
foreach (ListItem item in list.Items) { if (item.Attributes[OPTGROUPATTR] != null) { currentOptionGroup = item.Attributes[OPTGROUPATTR]; keyString = item.Value + item.Text; optionGroups[keyString] = currentOptionGroup; } }
return optionGroups; }
protected override void LoadAdapterViewState(object state) {
optionGroups = state as Dictionary<string, string>; }
}
|
|
|
|
 |
|
 |
I want to know how do I bind this drop down list to get data from sql server
|
|
|
|
 |
|
 |
"OnSelectedIndexChanged" is not working.Can any one suggest what changes i have to do in my code to use this event of dropdown list.
|
|
|
|
 |
|
 |
Hi any one knows what gone wrong to the selected index changed event??
|
|
|
|
 |
|
 |
Hi trying to use the "OnSelectedIndexChanged" event but it is not working.Can any one suggest what changes i have to do in my code to use this event of dropdown list.
|
|
|
|
 |
|
 |
Hi RashuD any solution for this post...?
|
|
|
|
 |
|
 |
Hi If you got any solution for the event problem. Pls forward it to me. siva@touchpointindia.com
Thanks
|
|
|
|
 |
|
 |
Is it possible to make more than one level item into the dropdown list? And user will be able to select any item from the list. eg.,
Item1 --Item11 ----Item111 ----Item112 --Item12 ----Item121 ----Item122 --Item13 Item2 --Item21 --Item22 Item3 Item4
|
|
|
|
 |
|
 |
hi,
i must say that this control is excellent - i m only facing problem in changing font style to normal (not italic) of 'optgroup' element.
i.e. the OptionGroup like 'Mammals' is in italic .. i want it to change to Normal style.
please help
regards asif
|
|
|
|
 |
|
 |
I've tried several ideas to get around this but it seems the default browser behaviour in IE cannot be overidden. In theory, the following CSS should do it:
select optgroup { font-style: normal; }
But this only seems to work in FireFox.
|
|
|
|
 |
|
 |
optgroup{font-style:normal}
is not IE compatible what will be the compatible code
|
|
|
|
 |
|
 |
Hi,
Following my previous post, since there is no known solution for the Viewstate issue, i decided to use the list as a control.
I did find out do that the items have to be added in grouping order, this cause a problem to me.
So below is a fix so you can add items in any order, note that items without a group will always be added on top.
[DefaultValue(true)] public bool SortItems { get { return ViewState["SortItems"] == null ? true : (bool)ViewState["SortItems"]; } set { ViewState["SortItems"] = value; } } protected override void RenderContents(HtmlTextWriter writer) { SortedDictionary> sortedItems = new SortedDictionary>();
foreach (ListItem item in this.Items) { if (item.Attributes[OptionGroupAttribute] == null) { if (sortedItems.ContainsKey("_")) { sortedItems["_"].Add(item); } else { sortedItems.Add("_", new List()); sortedItems["_"].Add(item); } } else { string optionGroup = item.Attributes[OptionGroupAttribute];
if (sortedItems.ContainsKey(optionGroup)) { sortedItems[optionGroup].Add(item); } else { sortedItems.Add(optionGroup, new List()); sortedItems[optionGroup].Add(item); } } }
foreach (KeyValuePair> entry in sortedItems) { if (SortItems) { entry.Value.Sort(delegate(ListItem item1, ListItem item2) { return item1.Text.CompareTo(item2.Text); }); }
if (entry.Key != "_") RenderOptionGroupBeginTag(entry.Key, writer);
foreach (ListItem item in entry.Value) { Page.ClientScript.RegisterForEventValidation(this.UniqueID, item.Value);
RenderListItem(item, writer); }
if (entry.Key != "_") RenderOptionGroupEndTag(writer); } }
And also here is a fix for the viewstate issues:
protected override object SaveViewState() { this.ViewState["-1Saved"] = (this.SelectedIndex == -1);
for (int i = 0; i < this.Items.Count; i++) { if (this.Items[i].Attributes[OptionGroupAttribute] != null) this.ViewState["ListItemGroup" + i] = this.Items[i].Attributes[OptionGroupAttribute]; } return base.SaveViewState(); }
protected override void LoadViewState(object state) {
base.LoadViewState(state);
for (int i = 0; i < this.Items.Count; i++) { if (this.ViewState["ListItemGroup" + i] != null) this.Items[i].Attributes[OptionGroupAttribute] = (string)this.ViewState["ListItemGroup" + i]; }
if (this.ViewState["-1Saved"] != null && (Boolean)this.ViewState["-1Saved"]) { this.SelectedIndex = -1; } }
|
|
|
|
 |
|
 |
I used Albert Weinert's code below to show my optgroups, everything works fine until the page postbacks. The list gets added again making duplicates and each time there is a post back the list grows. What could be wrong?
|
|
|
|
 |