|
I feel like having lost my OO knowledge. Actually, the problem looks simple: I want to create a class which operates on an object which
- inherits from System.Windows.Forms.Form
- implements the interface IDescribedActionsProvider
at the same time.
I could create a new Form type
public abstract class SpecialForm : Form, IDescribedActionsProvider
and require a parameter of that SpecialForm type.
But it does not work here: most of our Forms inherit from OurCompanyForm which need not implement IDescribedActionsProvider , and some of our forms do not inherit therefrom, but when they implement the interface, they should be an acceptable parameter.
It is composition what is required here, not inheritance.
Then I thought of Generics. I could define my class like
public class FormController<T> : IDisposable where T : Form, IDescribedActionsProvider
{
T _ControlledForm;
OtherType _OtherObject;
internal FormController(OtherType otherObject, T controlledForm)
{
_OtherObject = otherObject;
_ControlledForm = controlledForm;
....
}
It would work the way I intended, but it feels totally wrong:
That's not what Generics (see MSDN[^]) were meant for.
And I get problems when I want to create that FormController object in a Factory (because of the OtherType which is created there) which is not generic, i.e. a function like
public FormController<T> CreateFormcontroller(T controlledForm)
is not possible because T not defined here... And using "SpecialForm" instead of T does not work because of composition vs. inheritance.
What do you suggest? "Duck Typing" - but that's not a good OO practise either?
|
|
|
|
|
Bernhard Hiller wrote: What do you suggest?
Bernhard Hiller wrote: I want to create a class which operates on an object which implements ..OurCompanyForm; wouldn't that be easier?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
No, it does not work: there are other Forms implementing the interface, but not inheriting from OurCompanyForm.
|
|
|
|
|
Bernhard Hiller wrote: That's not what Generics (see MSDN[^]) were meant for.
Although MSDN keeps referring to collections, that's not the only use for generics. The problem you've described is a perfect candidate for generics.
Bernhard Hiller wrote: public FormController<T> CreateFormcontroller(T controlledForm)
is not possible because T not defined here...
That's easy to fix:
public FormController<T> CreateFormcontroller<T>(T controlledForm) where T : Form, IDescribedActionsProvider
{
...
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks, that works. My +5. When I tried to write it like that, I got one or more of those many <T>s wrong.
But it still feels a little "ugly"...
|
|
|
|
|
Hi,
I have created a Windows Service and i am calling a web service method from my windows service.
When i run my windows service, i am getting the below error
"Configuration system failed to initialize"
Note: The services are installed and my web service is running from Visual Studio (ASP.NET development server)
Please help to fix this error.
|
|
|
|
|
That's typically caused by a small typo in the configuration file, e.g. a space between a < and the following keyword...
|
|
|
|
|
Thank you. I think that was the problem (typo in config or any changes). I recreated my project and it worked well for me.
Thank you again.
|
|
|
|
|
I created one FormBase class in my Class file as following :
public partial class FormBase : Form
{
public FormBase()
{
this.Load += new System.EventHandler(this.FormLoad);
}
public void PanelUtil(Panel p1, Form f1)
{
p1.Left = (f1.ClientSize.Width - p1.Width) / 2;
p1.Top = (f1.ClientSize.Height - p1.Height) / 2;
}
protected virtual void FormLoad(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
}
}
and my all form contains the following code:
public partial class Form1 : FormBase
{
public Form1()
{
InitializeComponent();
}
private void Form1_Resize(object sender, EventArgs e)
{
PanelUtil(panel1, this);
}
}
But i don 't want to write Resize method and call
private void Form1_Resize(object sender, EventArgs e)
{ PanelUtil(panel1, this); } in all my windows forms.
I want to that when i inherit FormBase class then it automatically gives me output as my panel is center.
|
|
|
|
|
Member 10347092 wrote: I want to that when i inherit FormBase class then it automatically gives me output as my panel is center. Add the panel to the mainform; or loop all the controls on the form and look for the panel that needs to be resized.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
..what's not good about the answer?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I like it
Countervote given
I will never again mention that Dalek Dave was the poster of the One Millionth Lounge Post, nor that it was complete drivel.
How to ask a question
|
|
|
|
|
I've been working on a project for the past week or so, and it's come to my attention that I need a method of being able to 'track' the index of an item within a collection.
A prime example of what I'm trying to achieve is the System.Windows.Forms.ListViewItem class, which retains an Index property which is always matched to the actual index within the collection of a System.Windows.Forms.ListView .
A method I've been trying is iterating through the collection any time an update ends and updating each item individually. However, I have noticed that this takes a ridiculously long time when we begin achieving millions of rows. Items are removed from the collection, but then after the update has finished, it has to iterate through the collection to synchronize the indices.
Other than using LINQ on the collection from the individual item, can anyone suggest a better way to maintain the index of the item within the list?
|
|
|
|
|
|
I believe an issue with using IndexOf is that if the same item is added more than once to the collection, the value returned by IndexOf will be the first index only.
The item I'm storing in the collection could be added multiple times. For instance:
public class MyClass
{
public string Text { get; set; }
public int Index { get; set; }
};
private void ExampleList()
{
List<MyClass> list = new List<MyClass>();
MyClass first = new MyClass() { Text = "Hello" };
list.Add(first);
list.Add(first);
MyClass second = new MyClass() { Text = "Goodbye" };
list.Add(second);
System.Diagnostics.Debug.WriteLine(list[0].Index);
System.Diagnostics.Debug.WriteLine(list[1].Index);
System.Diagnostics.Debug.WriteLine(list[2].Index);
}
Obviously if multiple instances of the same object is going to be an issue, I could re-factor my code to prevent multiple additions, but it'd be preferable if the developer had the option to add the same item twice.
Otherwise, am I restricted entirely to updating the Index property on each collection change? I just wondered if there was some work-around (ie, creating an index array or using some sort of indexing engine built into the framework.)
Thanks
|
|
|
|
|
Chris Copeland wrote: Obviously if multiple instances of the same object is going to be an issue You didn't add multiple instances; you added a single object to the list twice. Now, you'd have to loop the list to find ALL the objects if there can be multiple - but then the property "Index" on the object is erroneous - if the object can be added to the list twice, then "Index" should return an array, returning 0 and 1 as the indexes where it is to be found.
Alternatively;
public class MyClass: ICloneable
{
public string Id = Guid.NewGuid().ToString();
public string Text { get; set; }
public override string ToString()
{
return Text;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
public object Clone()
{
return new MyClass() { Text = this.Text };
}
}
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I'd not thought about adding a unique identifier property. That makes much more sense than actually indexing the position of the item. I suppose the chances of collision are exceptionally low too when using Guid .
Thanks for the assistance, I'll give this a try when I land home!
|
|
|
|
|
Chris Copeland wrote: The item I'm storing in the collection could be added multiple times. This wasn't obvious (to me) in your original post. One solution would be to write an extension method IList<T>.IndicesOf(T) that would return an IEnumerable<int> of indices. But clearly, this doesn't scale when you have a large number of items.
/ravi
|
|
|
|
|
I'm with Ravi on that, what keeps you from adding / updating the information of an item at the time you access it by using IndexOf ()?
I will never again mention that Dalek Dave was the poster of the One Millionth Lounge Post, nor that it was complete drivel.
How to ask a question
|
|
|
|
|
Hi
Iam using VS13.
I have been using the "built" in DataGrid but now need some more functions.
I need a DataGrid that can:
Bind to BindingSource so i can use the BindingNavigator
Sort
Filter
Group
Edit and save
Exporting
Printing
Master/detail/detail (not necessary nested)
Etc
Budget 0-200 US Dollar.
Does anyone have som sugestions?
BR
Jonas
|
|
|
|
|
Google?
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
thank you for that very good answer.
I will email to info@google.com and se if they have a answer for me.
/J
|
|
|
|
|
hey brother,
Quote: Asp.Net unleashed by Sir Stephen Walther.
start reading.
Thanks a ton,
Rahul
|
|
|
|
|
Try Telerik or Devexpress. Both have free trials so you can check the grids out and see if they meet your needs.
|
|
|
|
|
Both of which are beyond his budget!
Never underestimate the power of human stupidity
RAH
|
|
|
|