Hi
I have tried change Microsoft combobox to Telerik new drop down list.
I have used this code to populate Microsoft combobox:
1.cbKlien.Items.Clear(); 2.var c =bS.view_Trans_Order_Custs.OrderBy(i => i.CustomerCode).Select( 4. i => new {i.CustomerCode, i.CompleteCustomerName}); 5. 6.cbKlien.Items.AddRange(c.ToArray()); 7.cbKlien.DisplayMember = "CustomerCode";It worked and was very fast.
But when I have added telerik drop down list I have can not populate using the some code :( I have received errors:
1.Error 1 The best overloaded method match for 'Telerik.WinControls.UI.RadListDataItemCollection.AddRange(System.Collections.Generic.IEnumerable<Telerik.WinControls.UI.RadListDataItem>)' has some invalid arguments c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100924 ZlecTrans Test od Telerik\ZlecTransp001\fMain.cs 219 10 Zlecenia transportowe
1.Error 2 Argument '1': cannot convert from 'AnonymousType#1[]' to 'System.Collections.Generic.IEnumerable<Telerik.WinControls.UI.RadListDataItem>' c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100924 ZlecTrans Test od Telerik\ZlecTransp001\fMain.cs 219 34 Zlecenia transportowe This error was on this line:
1.ddlKlien.Items.AddRange(c.ToArray());Of course I can populate using for but it very slow:
1.ddlKlien.Items.Clear(); 2. var c = dbS.view_Trans_Order_Custs.OrderBy(i => i.CustomerCode).Select( 3. i => new {i.CustomerCode, i.CompleteCustomerName}); 4. 5. for (int x = 0; x < c.ToArray().Length; x++) ddlKlien.Items.Add(c.ToArray()[x].CustomerCode); 6. //ddlKlien.Items.AddRange(c.ToArray()); 7. ddlKlien.DisplayMember = "CustomerCode";Could you help me correct my code for fast speed?
14 Answers, 1 is accepted
Did you try just setting the c as a data source for the DropDownList?
var c = bS.view_Trans_Order_Custs.OrderBy(i => i.CustomerCode).Select( i => new {i.CustomerCode, i.CompleteCustomerName}); cbKlien.DataSource = c; cbKlien.DisplayMember = "CustomerCode";Best Regards,
Emanuel Varga
Thanks for you answer but:
cbKlien.DataSource = c;
OK it work. But it is not fine for me. I prefer populate DropDownList only rather then connect DropDownList using DataSource with base. I am not sure it is clear or not because I am not professional programmer.
For example if I populate using ddlKlien.Items.AddRange(c.ToArray()); I can use ddlKlient.Items.Clear(); or add easy next data (without adding to database).
Do you know how can I do it
Ok, if you prefer doing things like this, you can use:
ddlKlien.Items.Clear();var c = dbS.view_Trans_Order_Custs.OrderBy(i => i.CustomerCode).Select( i => new RadListDataItem(i.CompleteCustomerName) { Value = i.CustomerCode });ddlKlien.Items.AddRange(c);And because you are adding items, you don't need the display member there, you are setting the display text when you are creating the RadListDataItem.
Hope this helps, if you have any other questions, please just let me know,
Best Regards,
Emanuel Varga
Thanks it loks fine but if I try run it I see error:
01.System.ArgumentException was unhandled 02. Message="An item with the same key has already been added."03. Source="mscorlib"04. StackTrace: 05. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) 06. at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 07. at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) 08. at System.Data.Linq.Mapping.UnmappedType.GetDataMember(MemberInfo mi) 09. at System.Data.Linq.SqlClient.QueryConverter.VisitMemberInit(MemberInitExpression init) 10. at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 11. at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector) 12. at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 13. at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 14. at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) 15. at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) 16. at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 17. at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 18. at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 19. at Telerik.WinControls.UI.RadListDataItemCollection.AddRange(IEnumerable`1 range) 20. at ZlecTransp001.fMain.Wypelnij() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\fMain.cs:line 232 21. at ZlecTransp001.fMain..ctor() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\fMain.cs:line 36 22. at ZlecTransp001.Program.Main() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\Program.cs:line 18 23. at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 24. at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 25. at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 26. at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 27. at System.Threading.ThreadHelper.ThreadStart() 28. InnerException:Do you know how resolve it?
You are adding them somewhere in a dictionary?
I know for sure that you can have two or more items with the same Text and Value in a DropDownList, so this is not the problem, sadly without seeing more of your code i cannot tell you what else is going on, but please check if you are not doing something else on an event fired by the DropDownList that could cause this behavior.
To start with, you could unregistered all of the events and just run the application like that and see if this problem persists.
Hope this helps, if you have any other questions, please just let me know,
Best Regards,
Emanuel Varga
Hi Emanuel
OK I cut all code in my program and object from form.
In this moment I had only one object dropdownlist ddlKlien
and this code:
01.using System; 02.using System.Drawing; 03.using System.Linq; 04.using System.Windows.Forms; 05.using Microsoft.Reporting.WinForms; 06.using Telerik.WinControls; 07.using Telerik.WinControls.UI; 08. 09.namespace ZlecTransp001 10.{ 11. public partial class fMain : Form 12. { 13. private readonly bazyDanychDataContext dbS; 14. private readonly zleceniaTransportoweDataContext dbZ; 15. 16. public fMain() 17. { 18. InitializeComponent(); 19. dbZ = new zleceniaTransportoweDataContext(); 20. dbS = new bazyDanychDataContext(); 21. 22. Wypelnij(); 23. } 24. 25. public void Wypelnij() 26. { 27. ddlKlien.Items.Clear(); 28. var x = dbS.view_Trans_Order_Custs.OrderBy(o => o.CustomerCode).Select( 29. o => new RadListDataItem(o.CompleteCustomerName) 30. { 31. Value = o.CustomerCode 32. }); 33. 34. ddlKlien.Items.AddRange(x); 35. } 36. } 37.}But all time I see this error when I run compile:
01.System.ArgumentException was unhandled 02. Message="An item with the same key has already been added."03. Source="mscorlib"04. StackTrace: 05. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) 06. at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 07. at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) 08. at System.Data.Linq.Mapping.UnmappedType.GetDataMember(MemberInfo mi) 09. at System.Data.Linq.SqlClient.QueryConverter.VisitMemberInit(MemberInitExpression init) 10. at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 11. at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector) 12. at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 13. at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 14. at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) 15. at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) 16. at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 17. at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 18. at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 19. at Telerik.WinControls.UI.RadListDataItemCollection.AddRange(IEnumerable`1 range) 20. at ZlecTransp001.fMain.Wypelnij() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\fMain.cs:line 35 21. at ZlecTransp001.fMain..ctor() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\fMain.cs:line 23 22. at ZlecTransp001.Program.Main() in c:\Users\PLRoStu\Documents\Visual Studio 2008\Projects\100929 ZlecTrans Test od Telerik testy\ZlecTransp001\Program.cs:line 18 23. at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 24. at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 25. at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 26. at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 27. at System.Threading.ThreadHelper.ThreadStart() 28. InnerException: What do you think about it?
I've prepared a form with a collection that does the same thing, please try it and tell me what's different, except the data context
namespace TestDropDownList{ using System; using System.ComponentModel; using System.Linq; using System.Windows.Forms; using Telerik.WinControls.UI; using System.Drawing; public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Size = new Size(300, 60); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { var radDropDownList = new RadDropDownList(); radDropDownList.Dock = DockStyle.Top; this.Controls.Add(radDropDownList); var x = new TestCollection(100).OrderBy(o => o.Id).Select(o => new RadListDataItem(o.Name) { Value = o.Id }); radDropDownList.Items.AddRange(x); } } public class Test { public int Id { get; set; } public string Name { get; set; } public Test(int id, string name) { this.Id = id; this.Name = name; } } public class TestCollection : BindingList<Test> { public TestCollection(int no) { for (int i = 0; i < no; i++) { this.Add(new Test(i, "item" + i)); } } }}Please let me know,
Best Regards,
Emanuel Varga
Emanuel's solution is correct. Please try to set the data source of RadDropDownList using Items.AddRange.
I hope this helps.
Peter
the Telerik team
I try this and answer in next week - sorry.
Thansk for help
I am sorry for big delay. And thanks again for your help
Today I take one hour for test it. Your code work correctly but my not :( I think there is little mistake but I do not know where. I am begginer in C# and maybe it is reason ;)
I thinks it is mistake in this query becasue x not return good value. Could you look on this code and on the picture?
http://www.fotosik.pl/pokaz_obrazek/pelny/06107702b089cea8.html
Generally, you can find the answer to your question in the support ticket that you have opened. Still, I am posting the same answer here in case our community is interested in it.
After deep investigation of this issue, we came to the conclusion that this exception is coming from the entity framework and it has nothing to do with our controls suite. The following example, where I am creating a custom list, demonstrates where the exception comes from:
public partial class Form1 : Form { private readonly testDBDataContext dbS; public class customList : List<RadListDataItem> { public void AddRange(IEnumerable<RadListDataItem> range) { foreach (RadListDataItem item in range) { this.Add(item); } } } public Form1() { InitializeComponent(); dbS=new testDBDataContext(); Wypelnij(); } public void Wypelnij() { customList list = new customList(); list.Clear(); var x = dbS.view_Trans_Order_Custs.OrderBy(o => o.CustomerCode).Select( o => new RadListDataItem(o.CompleteCustomerName) { Value = o.CustomerCode }); list.AddRange(x); }I hope you find this information helpful.
Sincerely yours,
Stefan
the Telerik team
Hi Stefan,
I have also tried to change Microsoft combobox to Telerik new drop down list.
For example, I have used this code to populate Microsoft combobox:
this.cbSalutation.Items.AddRange(new object[] {
"Mr.",
"Ms.",
"Mrs.",
"Mdm.",
"Dr."});
How can i change this for Telerik drop down list.
Thank you for writing.
Since RadDropDownList is using RadListDataItems for its Item collection, you have to create an instance of RadListDataItem instead of object:
this.radDropDownList1.Items.AddRange(new RadListDataItem[] {new RadListDataItem("item 1"),new RadListDataItem("item 2"),new RadListDataItem("item 3"),new RadListDataItem("item 4"),new RadListDataItem("item 5")});I hope this helps.
Best wishes,Stefan
the Telerik team
"Left of Key Text",
"Right of Key Text",
"Below Key Text",
"Above Key Text"});
You can also use this option, simply replace object with string and it works.
