|
Hello,
Just came across your interesting question.
If I got it write, I think you need to deal with inherited controls and a customzied property editor.
I will try to give you an idea of how you can solve your problem, but will not sneak into the time costing details (I will mark them for you).
ArjenGroeneveld wrote: like to create a Label control
What you need first is a custom label which derives from Forms.Label .
public class LabelExtended : System.Windows.Forms.Label
{
...
}
ArjenGroeneveld wrote: One the respective control is set in Design time,
To make it easy (for me), I will use a string property to hold the name of this selected control (how we do this will be next).
private string selectedControlName = string.Empty;
[
CategoryAttribute("Arjens Properties"),
DescriptionAttribute("Holds the name of the selected control."),
DefaultValueAttribute(""),
EditorAttribute(typeof(SelectControlEditor), typeof(UITypeEditor)) // this is the key
]
public string SelectedControlName
{
get { return selectedControlName; }
set { selectedControlName = value; }
}
ArjenGroeneveld wrote: an property in which I can select the available controls on the Form (except for the Label controls).
We just added an EditorAttribute to the property. This is a type of SelectControlEditor and derives from UITypeEditor , which we have to create now.
using System;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.ComponentModel;
using System.Drawing.Design;
...
public class SelectControlEditor : UITypeEditor
{
...
}
What I want to show you is a DropDown editor, where you are able to select a control out of a list of control names.
First we give the editor class the information about the DropDown , by overriding the GetEditStyle method like this:
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if( context != null ) return UITypeEditorEditStyle.DropDown;
return base.GetEditStyle(context);
}
Now we need to tell the editor how to edit your property, by overriding the EditValue method.
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if ((context != null) && (provider != null))
{
IWindowsFormsEditorService editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (editorService != null)
{
Control owner = context.Instance as Control;
if (owner != null)
{
SelectControl selectControlEditor = new SelectControl(editorService, owner);
selectControlEditor.SelectedControl = (string)value;
editorService.DropDownControl(selectControlEditor);
if (selectControlEditor.Valid)
{
return selectControlEditor.SelectedControl;
}
else
{
return value;
}
}
}
}
return base.EditValue(context, provider, value);
}
Now we create an UserControl named SelectControl, which inherits Forms.UserControl .
On this UserControl we add a ComboBox named "cbSelectControls", and a Button named "bOk" (for the button we handle the Click Event).
I will make additional commends in the code:
public partial class SelectControl : UserControl
{
IWindowsFormsEditorService editorService = null;
public SelectControl(IWindowsFormsEditorService editorService, Control ownerControl)
{
InitializeComponent();
this.editorService = editorService;
if (ownerControl != null)
{
Control parentControl = ownerControl.Parent;
if (parentControl != null)
{
foreach (Control c in parentControl.Controls)
{
if (!c is LabelExtended)
{
cbSelectControls.Items.Add(c.Name);
}
}
}
}
}
public string SelectedControl
{
get { return cbSelectControls.Text; }
set { cbSelectControls.Text = value;}
}
bool valid = false;
public bool Valid
{
get { return valid; }
set { valid = value; }
}
private void bOk_Click(object sender, EventArgs e)
{
Valid = true;
editorService.CloseDropDown();
}
}
What we now have done is:
If you select your label in the designer and edit the SelectedControlName over the "..." button, an dropdown will be shown, with your UserControl on it.
On this UserControl you will hopefully find a combobox filled with the controls names, which are in the same collection as your label is.
If you now select a controls Name and click the ok Button, it should appear at the SelectedControlName property of your label.
ArjenGroeneveld wrote: this control will get the focus in Runtime when the user moves with the mouse over the Label control
For this task we could override the OnMouseEnter Method of your LabelExtended class, like this:
protected override void OnMouseEnter(EventArgs e)
{
if (!DesignMode)
{
if (!string.IsNullOrEmpty(SelectedControlName))
{
Control parentControl = this.Parent;
if (parentControl != null)
{
foreach (Control c in parentControl.Controls)
{
if (c.Name.Equals(SelectedControlName))
{
c.Focus();
}
}
}
}
}
base.OnMouseEnter(e);
}
Please note:
.)I haven't fully tested the code and didi some changes during editing with no compilation run.
.)The code as it is will only take care of controls which have the same parent Control than your label has. So some (not too hard I guess) work is still open. Don't forget to create unique names if you consider to look in subcontainer.
Please also note:
.) I had great fun looking for a solution for your problem, so thank you for asking!
I hope it helps you. (Would be nice to get a feeback)
All the best,
Martin
|
|
|
|
|
I wrote a word in the RichTextBox, this word represent an object. I want to click this object.
For example; I wrote following text to RichTextBox;
Hello codeproject members.
I want to "codeproject" word represent an object. May be get ID when click to this word.
How can I do? Thanks...
|
|
|
|
|
Hi,
Try like this may be its not correct approach. But it solves your problem.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string s1 = this.richTextBox1.Text;
sample o1 = new sample();
o1.sobject = s1;
}
}
public class sample
{
public string sobject;
}
To invent something, you need a mountain of junk in your mind.
---------------------Thomas alva edison
|
|
|
|
|
Program how to interact when cursor on this word?
|
|
|
|
|
i want to display a user control in place of default tooltip displayed.
Can smebody help me with the code????
thanks in advance....
|
|
|
|
|
For which control you want to do that ? You can trap Mouse move event and show some user control on mouse move.
Abhijit Jana | Codeproject MVP
Web Site : abhijitjana.net
Don't forget to click "Good Answer" on the post(s) that helped you.
|
|
|
|
|
i want to do this for picture box.
can u plz help wid the code snipet????
thanks....
|
|
|
|
|
I have a process which can be run from any number of servers. All of them access the same database. How do I synchronize the severs data access?
Here are the details.
My common database server has a table T1. It has columns C1, C2 and C3.
My process has the following steps.
1. Read T1 table.
2. If there is any row with value V1 for C1, wait in a loop and go to step-1.
3. If there are no such rows, insert a row with V1 for C1 and appropriate values for the rest of the columns.
4. Start my business logic.
5. Once the business logic is complete, delete the row entered in step-3.
Now the same process runs from different servers. So there is a chance that 2 or more processes will do steps 1 and 2 simultaneously and might end up creating 2 or more rows with V1 value for C1. I don't want that to happen. How will I make sure only once process can perform steps 1 and 2 at a time? I can not use lock and monitor to synchronize the access as I am running from different process spaces.
How do I do it then?
|
|
|
|
|
One way would be to create a separate table in the DB for locks (or just reuse the existing one). Before a process starts step 3 (or whatever the crucial step is) it checks that table for a well known value, if it exists then it knows that some other process has started business logic and it should wait. If the lock value isn't found then it can create it and continue on. The lock value that it created will signal other processes that it is currently executing business logic and they should wait.
This will work if the DB column that you're using for a lock is properly setup with a primary key constraint. If two processes try to write the same value into a PK column at (nearly) the same time the first will succeed and the other will throw an exception.
Another "Outside the Database" solution would be to make all of the processes communicate with each other via some other mechanism (sockets, MSMQ, File IO, etc) and work out that way which one should be doing what.
|
|
|
|
|
Thanks Jimmanuel for the reply. It gives some good pointers.
I am more interested in the "Outside the Database" solutions. I suppose there are no design patterns as such which cover this scenario. Right?
|
|
|
|
|
Sure there are, look up "concurrency[^]", "transactions[^]", "inter-process communication[^]" (aka IPC) and "messaging systems[^]". I haven't looked for the others but I know that there's a decent IPC article on CP somewhere.
If you have lots of time to read, this[^] book has a chapter about transactions and concurrency and this[^] is entirely about building applications and messaging protocols in distributed systems.
|
|
|
|
|
Thank you very much. Really helpful leads.
|
|
|
|
|
Glad to help
|
|
|
|
|
such as, if i want to convert 240 in binary,octal, hex and vice versa
|
|
|
|
|
|
The Indian universities must have started a new semester...
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
Not exactly. It should be examination time in many of the universities here. Project submission dates approaching fast, very fast.
50-50-90 rule: Anytime I have a 50-50 chance of getting something right, there's a 90% probability I'll get it wrong...!!
|
|
|
|
|
i have created a segment by using the following code.
Data="M0.5,0.5
L23.877726,0.5 23.912098,1.4036387
C27.248646,67.155535 81.673632,119.5 148.25,119.5 214.82637,119.5 269.25135,67.155535 272.58789,1.4036387 L272.62229,0.5 297.1016,0.5 297.05591,1.7070469 C293.06088,80.831659 227.88823,143.5 147.75,143.5 74.074534,143.5 13.048166,90.531885 0.58002052,20.504782
L0.5,20.020197 z" />;
now from C#, i want to change the color of that segment from black to blue.
how can i make that change? please give me the solution with sample code.
|
|
|
|
|
Are you working with WPF or Silverlight?
Next time, post in the appropriate forum. It may help you get an answer faster.
Now, for the question, I dont think you can change the color just by looking at the path text. Try changing the color of the path object by itself.
There's nothing left in my right brain and nothing right in my left brain. |
|
|
|
|
|
i want to display a 3 row,2 column table in the tooltip used for a user control.
can smeone help me with the code????
thanks in advance....
|
|
|
|
|
Try this link
CPPToolTip v2.1[^]
please click answered if it helps you
Regards
Narendra Singh
(Jindal Tech Ventures)
|
|
|
|
|
Hey Guys,
I've been given an assignment to organize a programming seminar next January. It's supposed to be for young people who have interest in programming, just need to be convinced. However, i need a catchy title for the seminar. Help please.
He who goes for revenge must first dig two graves.
|
|
|
|
|
How about "I didn't get what I wanted in the lounge so I'll try all the other forums?"
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
Have you considered using "Free Beer" as the title?
|
|
|
|
|