|
If you want my full solution it's here[^].
Created with VC# 2008 (am waiting for Imperial to get VS2008 Pro through their campus agreement).
Just had another thought, you could use attributes to set the sort order of properties, if the attribute doesn't exist then don't sort. Something like:
[Sort(0, SortOrder.Ascending)]
public string Name { get; set; }
[Sort(1, SortOrder.Descending)]
public DateTime DOB { get; set; }
(Example uses automatic properties, a fantastic feature).
DaveyM69 wrote: The article you linked to is FASCINATING! It looks like the way to go. It'll keep me busy over xmas I'm sure.
It certainly is, I experimented with it for a rewrite of a DAL that I wrote for a company I worked for but LINQ seems to have more or less knocked this method on the head. Although it would be a very cool way to go.
It's these kind of problems which I enjoy helping out in, what with my degree and so on I don't have that much time for programming and that which I do do has been in Pascal and Assembler for the course (although I don't do any extra-curricular stuff like my fellows since it's simply a change of framework and syntax). And god-forbid in the near future some Java, I was offered a job by one of my lecturers at Imperial (Software Engineering lecturer, originally from the Computer Science department but now lecturing for Electrical & Electronic Engineering) and this unfortunately is in Java
|
|
|
|
|
A new and updated project[^] has been uploaded.
Sorry if it took the fun away from you but I needed something to relax ( ) my mind so continued with the Three Monkeys approach and have implemented the suggestions I made earlier. (I don't know whether this is possible in your case): but if you inherit your "data" class from ComparableObject then unless the CompareTo method is overridden it automatically compares itself through "reflection".
To allow this you tag each of your properties with a SortAttribute specifying the priority in which the properties are to be sorted, see code for examples. The method which builds the DynamicMethod looks for these attributes (using a piece of LINQ, making it sooo much easier, and ordering them in order of the priority). It then basically goes through and generates the IL for making the comparison, as if you'd typed it out yourself.
These dynamic methods are stored in a Dictionary<TKey,TValue> so that subsequent calls don't hit the performance penalty of performing reflection.
Quite a handy piece of code actually, might write it up into an article...
[BTW]Thanks for providing me with something "challenging" to do in C#[/BTW]
|
|
|
|
|
Cool! Very cool actually. This is one of those things that initially you think 'why does he want to do that?', but the more you think about it, it makes sense.
The amount of times I've had to write custom comparers so I can sort on either one particular property or recursively sort on many, I figured there had to be a way of implementing a more Generic one.
I developed one that worked but you had to pass a string array containing the properties you wished to sort on. It just felt a bit clumsy as the properties were already defined in the class so why was I having to restate them?
Marvellous work.
Ed.Poore wrote: [BTW]Thanks for providing me with something "challenging" to do in C#[/BTW]
- no problem
|
|
|
|
|
Well I've tidied the code up a bit and got it into article form, now just got to write the damn article...
|
|
|
|
|
Hi,
I want to translate a word using Babylon In my Application, is it possible?
i.e. I want in my app word sends to babylon and get translation.
Should I crack babylone for it?
Please give me general help about it.
Best wishes
|
|
|
|
|
Since this is a question about 3rd party software, you probably won't get an answer in this forum. Have you contacted Babylon support and asked if they have a developer API available?
|
|
|
|
|
I would advise against 'cracking' babylon. As that is illegal.
Also, what you would be doing wouldn't really be a crack... and i question your ability to do it. Either way, still illegal.
My current favourite word is: Bauble!
-SK Genius
|
|
|
|
|
I inherited a usercontrol from the System.Windows.Form but when i assigned it to the PropertyGrid control it inherits all the Form Properties and display in the PropertyGrid. How can I display on the properties which are declared in my usercontrol.
|
|
|
|
|
I think you are asking, "How can I hide the UserControl properties from being displayed in a PropertyGrid control?" The answer to this question is by overloading the appropriate property and setting the Browsable attribute of your property to false:
[Browsable(false)]
public override string Text {
get { return base.Text; }
set { base.Text = value; }
} If this didn't answer your question, you need to rephrase, because I can't understand what you are asking for.
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
|
See my answer to the post below to find out how to do this.
|
|
|
|
|
Hi,
is it possible to remove a property from a inherited control?
for example if i inherit a textbox and i want to remove the "Text" property, is it possible?
|
|
|
|
|
Hi
No you can not remove a Property,
but i think System.ComponentModel.BrowsableAttribute should do the job:
[Browsable(false)]
public override string Text
{
get{}
set{}
}
hope this helps
greets
M@u
|
|
|
|
|
I sometimes make my overrides simply throw a new NotImplementedException, so even though I can't remove them from the options, I can prevent the user from calling them. You can also use the "new" keyword, and return some unexpected type for the property like bool, so noone would call it. The problem, however, is that if they cast your object as a TextBox, then they will still have access to that method. The final option that I have used (my prefered method, although it takes the most time), is to inherit from object (or Control in your case, since you want it to be drawn), but have a private member of type TextBox. Then, export only those properties that you want to be exposed on the underlying type, as follows:
public class m_TextBox : Control {
private TextBox m_Base = new TextBox();
...
public int TextLength {
get { return m_Base.TextLength; }
}
...
} Also note that you will need to override certain methods like OnPaint, OnClick, etc., as well as exporting the events you want on the object. This is a real pain in the a**, but it is the only way I have found in C# to create objects that expose only those properties that you want to expose. Hope this helps,
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
You could always override the PostFilterProperties method and remove the base properties.
protected override void PostFilterProperties(IDictionary props)
{
props.Remove("Text");
}
|
|
|
|
|
|
Hi All,
Can anyone help me with a method that could generate random dummy files with extensions..(.txt, .log, .exe) in a specified folder?
|
|
|
|
|
|
what's the folder's name? "My Homework"?
|
|
|
|
|
Folder name could be anything...doesn't matter i can change that :P
I have the following code..
private void button1_Click(object sender, EventArgs e)
{
StreamWriter outStream = null;
string filename = "output.txt";
string message = null;
try
{
outStream = new StreamWriter(filename);
outStream.WriteLine("Hello World");
outStream.Close();
MessageBox.Show(filename);
}
catch (IOException e1)
{
message = "Unable to create " + filename + "\r\n";
message += String.Format("Reason: {0}", e1.Message);
MessageBox.Show(message);
return;
}
message = ("File successfully created");
}
But, this just creates one txt file...Basically, right now I am working with windows application...I have written a program that can delete files from s specified folder older than X number of days, hrs, mins respectively..it works fine..But, i want to test this code thoroughly on a 'dummy' folder before ilet it loose on real data as deleting files in bulk makes me nervous! So, for that i want to create a method that would generete files for me with different extensions...files dont have to be empty... I know i can use for loop to create more files using my own code. But, I am just not sure how I am going to create files with different filter.
Also, The problem with the dummy files is to get a decent spread of 'last modifed' times and i think the only practical way to achieve that is copy existing files from another folder which can be done programatically using File.Copy(). I suppose i could augment these by creating new files programatically with any extension i like and save them to disk using the StreamWriter class.
But, I just want to use a different approach here and see if it actually works
|
|
|
|
|
Ok
you could put the extensions you want to create into an array and then use System.Random class to use a random Extension
private string[] myExtensions[] = new string[]{"exe","txt","log","jpg","bmp"/*,...*/}
to avoid the IOException saying "the file already exists" you could use a timestamp that is added to the Filename
string myFileName = string.Format(@"{0}\someName_{1}.{2}",someFolder,System.DateTime.Now.Ticks,randomExtension);<br />
<br />
and finally, if you want to manipulate the Creation/Modification - Dates of a file, take a look at the <code>System.IO.FileInfo Class
greets
M@u
|
|
|
|
|
Thanks m@u.
I can try what you said, But i think its much easier to get it done.
I think i can do it the following way. Files are getting created in the executable path of windows application project. I want to give out my own path. how do i do that?
private void button1_Click(object sender, EventArgs e)
{
StreamWriter outStream = null;
string message = null;
for (int i = 0; i < (10000); i++)
{
string filename = "output";
filename += i.ToString();
if (i % 3 == 0)
{//multiple of three
filename += ".txt";
}
else if (i % 5 == 0)
{//multiple of 5
filename += ".log";
}
else
{
filename += ".dat";
}
try
{
outStream = new StreamWriter(filename);
outStream.WriteLine("Hello World");
Thread.Sleep(60000);
outStream.Close();
}
catch (IOException e1)
{
message = "Unable to create " + filename + "\r\n";
message += String.Format("Reason: {0}", e1.Message);
MessageBox.Show(message);
}
}
|
|
|
|
|
two comments:
1. that is NOT random at all
2. always show the entire exception, not just it's message part; you may miss essential info.
|
|
|
|
|
Yeah, you might want to use a RNG to generate random numbers, which could be used directly or indirectly as the filename. I recommend a Mersenne Twister, the classes for which are on the web.
I agree with No. 2 as well. Exceptions aren't always what they seem to be, so it's good to have any information you can get.
|
|
|
|
|
Why don't you add a "move to archive" option? That would make your program more useful, and also make you less nervous
|
|
|
|