|
Hi..
I have made a custom template that derives from ITemplate.
I have also create a class that inherits from INaming container.
For some reason i can not get the INaming container to work with my custom template. In order to implement the INaming container one must have a property that returns an ITemplate.
Why can i not return my custom Template the derives from ITemplate?
here is some of my code:
----
[ParseChildren(true)]
[PersistChildren(false)]
[ToolboxData("<{0}:HoverCalendar runat=server>")]
public class HoverCalendar : WebControl, INamingContainer
{
private ITemplate _itemTemplate;
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ItemTemplate
{
get { return _itemTemplate; }
set { _itemTemplate = value; }
}
protected override void CreateChildControls()
{
Controls.Clear();
HtmlGenericControl container = new HtmlGenericControl("div");
if (ItemTemplate != null)
{ ItemTemplate.InstantiateIn(container); }
Controls.Add(container);
base.CreateChildControls();
}
}
*** this works fine; however, how do i use my ( the one below for example ) template?
----
public class myItemplate_1 : ITemplate
{
static int itemcount = 0;
ListItemType templateType;
public myItemplate_1(ListItemType type)
{
templateType = type;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc = new Literal();
switch (templateType)
{
case ListItemType.Header:
lc.Text = "<TABLE border=1><TR><TH>Items</TH></TR>";
break;
case ListItemType.Item:
lc.Text = "<TR><TD>Item number: " + itemcount.ToString() +
"</TD></TR>";
break;
case ListItemType.AlternatingItem:
lc.Text = "<TR><TD bgcolor=lightblue>Item number: " +
itemcount.ToString() + "</TD></TR>";
break;
case ListItemType.Footer:
lc.Text = "</TABLE>";
break;
}
container.Controls.Add(lc);
itemcount += 1;
}
}
thanks
erik
|
|
|
|
|
I have a class which looks like that:
class Stuff
{
Dictionary<string, object> properties;
List<Stuff> children;
}
I'm writing a home made XML 'serialization'.
I quote that, because it's not serialization, I'm writing the XML writer myself (without System.Reflection).
I'm using a shema like that:
<stuff count=2 key1="value1" key2="value2" key3="value3">
<stuf>
.........
</stuff>
<stuf>
.........
</stuff>
</stuff>
where count = children.Count
and key1,2,3 are the keys in the properties dictionary and value1,2,3 their values.
properties is to be filled by the user with whatever (s)he wants.
Now my problem is:
==============
As the user could put whatever (s)he wants in the properties dictionary (s)he could as well create a key named 'count', therefore the 'count' atribute will be present twice in the tag.
It's not a problem for my reader (which expect a first count followed by any kind of attribute) but it might be for other people wanting to consume my XML documents.
What do you think?
it's actually much easier this way...
(particularly because this sample output is far from the whole story)
|
|
|
|
|
Super Lloyd wrote: What do you think?
Well, first of all, I think that the count attribute does not have a purpose. You should be able to just read the child nodes one at a time and add them to your list. Also, what is to say that the property key doesn't contain special characters or spaces?
It seems to me that you're limiting yourself by allowing the user to specify the attributes. If you add a section inside your root node called "properties" and use the <add key="..." value="..."/> format like Microsoft does, you enable yourself to write a concrete XML schema. This allows you to validate the XML against the schema first before trying to parse it, which is a good way to catch structure errors early without having to have all the validation code stuck in your deserialization code.
Logifusion[^]
If not entertaining, write your Congressman.
|
|
|
|
|
1. the count attribute has a performance 'raison d'etre'
there are few instance where it could be be big (over some thousands), if I don't specify I am going to run into many resize.
This is really annoying as I'm not using a List which double its internal capacity every time but (purposefully) an home made collection which grows its internal capaciy linearly, hence lots of resize/copy will happen.
2.
I thought of a format like
<tag>
<properties>
......
</properties>
<content>
......
</content>
</tag>
but it's going to completely blow up the size of my XML file (lots of tag here!), which annoys me...
whereas my format is 'compact'.
|
|
|
|
|
Hi i just want to know if it is possible to do the following in some way...
PrintPreviewDialog ppd = new PrintPreviewDialog();
ppd.Document = <Now here is what i want to know>
ppd.UseAntiAlias = true;
ppd.PrintPreviewControl.Zoom = 1.0;
ppd.WindowState = FormWindowState.Maximized;
ppd.ShowDialog(this);
Can you specify a specific file like: "C:\Test\invoice.html" in the "ppd.Document = " section?
"Many of life's failures are people who did not realize how close they were to success when they gave up." Thomas A. Edison
|
|
|
|
|
I have a var
List<object> firstList = new List<object>();
.. do some work ...
I have another list.
List<object> secondList = new List<object>();
what I want to do is add the second list to the First list.
firstList.AddRange(secondList);
Does anyone know how to accomplish this. Links or answers would be great.
Thanks,
Nick
-- modified at 10:09 Monday 14th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
The concise version of your post:
List<object> firstList = new List<object>();
List<object> secondList = new List<object>();
firstList.AddRange(secondList);
Ista wrote: Does anyone know how to accomplish this.
Didn't you just answer your own question?
|
|
|
|
|
no. That doesn't work.
I even Tried AddRanges(secondList.Convert<ienumable>) and it didnt work
-- modified at 10:42 Monday 14th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
Ista wrote: I even Tried AddRanges(secondList.Convert) and it didnt work
What is secondList.Convert? There's no need to convert it. Just firstList.AddRange(secondList).
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: And in this corner, the Party of Allah
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
That doesn't work. thanks tho
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
It does work, but only for C# 2.0 (as the AddRange method, not to mention the generic List<T> object, are both new additions to .NET 2.0). Are you using an older version?
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: And in this corner, the Party of Allah
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
Judah Himango wrote: It does work, but only for C# 2.0 (as the AddRange method, not to mention the generic List<t> object, are both new additions to .NET 2.0). Are you using an older version?
nope
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
Ok then, that code works, compiles and runs just fine:
List<object> list1 = new List<object>();
List<object> list2 = new List<object>();
list1.AddRange(list2);
If that's not compiling for you, please give me the compiler error you're seeing.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: And in this corner, the Party of Allah
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
I thank you for trying.
The problem was this:
<br />
The original as a List<Entry><br />
<br />
and I was returning a List<object><br />
and when calling AddRange the denominator must match.
So I need to call ConvertAll to fix the issue. ( transform the object to an Entry )
I do thank you for taking the time to help me with my issue.
Thanks,
Nick
-- modified at 15:38 Tuesday 15th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
That does work...try creating a console project and put this code into it.
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<object> lstA = new List<object>();
List<object> lstB = new List<object>();
lstA.Add("a");
lstA.Add("b");
lstA.Add("c");
lstA.Add("d");
lstB.Add("e");
lstB.Add("f");
lstB.Add("g");
lstB.Add("h");
lstA.AddRange(lstB);
foreach (string s in lstA)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}
}
It provides the following output:
a
b
c
d
e
f
g
h
So, it would seem you've got other issues going on.
|
|
|
|
|
So I make this call:
__entries.AddRange(LoadEntries(typeof(Entry), parent.ID, parent)); // Entry is the class I create
which in turn calls this:
<br />
public List<object> LoadEntries(Type childType, int topicID, object topicParent) {<br />
<br />
List<object> returns = new List<object>();<br />
<br />
return returns;<br />
}<br />
And it gives me this error:
The best overloaded method match for 'System.Collections.Generic.List<t>.AddRange(System.Collections.Generic.IEnumerable<t>)' has some invalid arguments
-- modified at 11:24 Monday 14th August, 2006
-- modified at 11:25 Monday 14th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
I would use process of elimination to figure this problem out.
Replace the call to LoadEntries with something to the effect of:
new List<object>()
Or:
List<object> lstTemp = LoadEntries(typeof(Entry), parent.ID, parent);<br />
__entries.AddRange(lstTemp);
And see if that changes anything. The code I supplied works for the simple case and unless you've come across a compiler error (which is possible, but not very likely) it should work for this.
If not, keep trying to eliminate pieces of the code that might be causing the problem till you find something that works.
|
|
|
|
|
so I changed the code to be just
List<object> l = new List<object>(new ForumDAL.DALFactory().LoadEntries(typeof(T), Convert.ToInt32(prop.GetValue(__parent, null)), __parent));
__items.AddRange(l);
still doesn't work because GetEnumerator() does not work over Generic types.
Is there some way to convert it to just a standard Array type that supports IEnumerable in 1 line of code?
Here is the definietion if this helps
protected List<T> __items = new List<T>();
-- modified at 12:53 Monday 14th August, 2006
-- modified at 12:54 Monday 14th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
Try using:
lstA.AddRange(lstB.ToArray());
What object type is the __items using? I hope its of object.
I would suggest not using the LoadEntries call at all to ensure what exactly the problem is. Separate your code into parts and try things you know work, until you find out what breaks it.
Good luck.
|
|
|
|
|
Andrew Rissing wrote: Try using:
lstA.AddRange(lstB.ToArray());
What object type is the __items using? I hope its of object.
I would suggest not using the LoadEntries call at all to ensure what exactly the problem is. Separate your code into parts and try things you know work, until you find out what breaks it.
Good luck.
Ok. I'm trying to remain relaxed on this one.
So, I did what you said and I have this:
List<object> bb = new List<object>();
__items.AddRange(bb);
Please pick this apart and say what I'm doing wrong.
Thanks,
Nick
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
Nick,
I would double check that __items is of List<object>. What is the compiling error that you're getting?
I'm trying to help, but it just seems you've got something else going on here that is either really simple (mismatch on type, an overloaded class/method, etc.) or something out of your hands like a compiler issue.
|
|
|
|
|
public class ForumList<T> : IEnumerable {
protected List<T> __items = new List<T>();
... code ...
List<T> bb = new List<T>();
__items.AddRange(bb);
Okay so this worked.
but, if say i do this:
List<T> bb = new List<T>();
List<object> cc = new List<object>();
bb.AddRange(cc);
it wont work. It must be explictly created as type of "T". Is there a way through, maybe reflection, that I can add these dynamically?
The problem I have is that the LoadEntries has no knowledge of the Entry class the template value is. SO I would need to create it on the fly. Otherwise I get a circular reference issue.
-- modified at 15:52 Monday 14th August, 2006
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
You'll have to convert the list coming out of the function then to the proper type.
Try using ConvertAll on the List instance or perhaps by iterating over the list and type casting by hand. Either will do...
|
|
|
|
|
Hey, thanks for all your help. I think I have it working now.
Nick
--------------------------------------------------------
1 line of code equals many bugs. So don't write any!!
My mad coder blog
|
|
|
|
|
hi friends, i am doing a project on windows media player using c#. i know how to play mp3 songs but i'm unable to make a mp3 songs playlist. can any one help me with code.
thank you.
-- modified at 11:04 Monday 14th August, 2006
|
|
|
|