Click here to Skip to main content
Email Password   helpLost your password?

Screenshot - TestIPAddressControl.png

Introduction

Why didn't Microsoft include an IP address control in the stock toolbox for Visual Studio .NET? I needed something similar to the MFC CIPAddressCtrl class in a C# application recently, and was forced to roll my own. I tried to mimic the behavior of CIPAddressCtrl using C# here, and hopefully I've succeeded.

Background

IPAddressControl is really a composite UserControl that aggregates four specialized TextBox controls of type FieldCtrl and three specialized Controls of type DotCtrl. Here's a picture:

Screenshot - close_up.gif

The FieldCtrls do some validation and keyboard filtering, in addition to standard TextBox behavior. The DotCtrls do nothing but draw a dot.

Using the Code

Once the library containing IPAddressControl (IPAddressControlLib.dll) is built, add the control to the Toolbox in Visual Studio. From the Toolbox, just drag the control onto a form and you're ready to go. The interface to IPAddressControl is very simple.

Public Instance Properties

Public Instance Methods

The above properties and methods are in addition to the stock properties and methods of UserControl. Stock properties such as Text, Enabled, and Font -- as well as stock methods such as ToString() -- work as expected. The client code can register a handler for the public event, FieldChangedEvent, to be notified when any text in the fields of the control changes.

Note that Text and ToString() may not return the same value. If there are any empty fields in the control, Text will return a value that will reflect the empty fields. ToString() will fill in any empty fields with that field's RangeLower value. Also, if you are using the control to create an IPAddress, you can easily do so using this control's GetAddressBytes() method:

IPAddress ipAddress = new IPAddress( ipAddressControl.GetAddressBytes() );

History

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Generaldisplay ordinary textbox shortcut menu
pillesoft
3:32 19 Nov '09  
thanks for this control!
but i have one issue. i would like to copy the contents (ip address) of that control. it is not possible with right click, which is default for the textbox.
so, i would like to have the shortcut menu with Undo, Cut, Copy, Paste, Delete, Select All

is it possible to implement this?
Ivan
General[HOWTO] Adding this control or another to VS Toolbox
Vincent DUVERNET (Nolmë Informatique)
23:32 2 Aug '09  
Hi,

it's just a comment for people who want's to use graphical interface of VS.

Go to menu 'Tools'
Select 'Choose Toolbox Items'


Under tab '.NET Framework Components'
Click on button 'Browse'

Select 'IPAddressControlLib.dll' in the Release directory of the project.

You'll now have in the toolbox a new entry at the top called : IPAddressControlLib Components

++
Vincent
GeneralMDI Child Bug
mikerileyii
6:50 21 May '09  
I've found a problem using this control in a form set as an MDI Child.

public frmMDIParent()
{
InitializeComponent();
frmContainingIPControl newForm = new frmContainingIPControl();
newForm.MdiParent = this;
newForm.Show();
}

When the form is rendered, the IP Control is not visible. If I comment out newForm.MdiParen = this; the control is visible.

The workaround I did is instantiating the form in the MDI parent form's Activated event. Like this:

private void frmMDIParent_Activated(object sender, EventArgs e)
{
frmContainingIPControl newForm = new frmContainingIPControl();
newForm.MdiParent = this;
newForm.Show();
}

Anyone know why it does not show up in the first code example?
GeneralWrong layout in Korean XP
disore
1:08 29 Apr '09  
Hi!

Thanks for a really great control!

I have however noticed strange behavior on Korean Windows XP Professional. The fourth IP block is merely visible. I've uploaded a snapshot here.

Best regards,
Disore

Why is it drug addicts and computer afficionados are both called users?
--Clifford Stoll

GeneralGreat!
jose_camacho
22:28 25 Mar '09  
Thank you very much. I wonder why this MS-guys did not include such a control in the .NET. Maybe it has something to do with licenses and patents-rights.

Or maybe they just want us to do some work ... Big Grin


José
GeneralProblem with ShortCuts
StefanFrank
7:14 11 Feb '09  
I've encountered a problem when using the IPAddressControl together with other simple controls like labels or comboboxes which have short cuts. You can reach all controls via their short cuts if other controls have the focus. If the IPAddressControl has the focus, the other controls cannot be reached via their short cuts, the focus remains in the IPAddressControl instead.
Analyzing the source code doesn't give me the deciding hint, any ideas to solve this problem?
GeneralRe: Problem with ShortCuts
mid=5741
9:44 11 Feb '09  
Have you tried the version that is available at http://ipaddresscontrollib.googlecode.com[^]?

If that version doesn't work, would you please create a small project demonstrating the problem and attach it to a new issue at the Google Code site[^]?
GeneralRe: Problem with ShortCuts
StefanFrank
5:17 23 Mar '09  
It seems to be a special problem in our application, which is a C++/C# mixed mode one. In a native C# application I cannot reproduce the problem. So I think we can close this issue.
GeneralThanks
Dr.Luiji
22:53 28 Jan '09  
Many thanks, you save me some hours of work.
have a 5.

Dr.Luiji

Trust and you'll be trusted.

Try iPhone UI [^] a new fresh face for your Windows Mobile, here on Code Project.

Generalgood article
Donsw
18:30 17 Jan '09  
The new 2008 has a masktextbox and it still does not have an Ip mask. good work. Smile
GeneralSmall request with the auto correction of too big value
smudge1
4:17 7 Nov '08  
When you enter a too big value in a field, the control make an auto correction of the value to 255.
After this auto correction, the cursor is placed on the left side of the value and it's no more possible to use the key point to go to the next field.

Sorry for my English, I hope you understand what I mean.

Thank you for your work...
GeneralThank you !
gaby_la_star
2:40 12 Oct '08  
Your control is simply the best one of all the IP controls I tried, including those I've developped myself.
Even better than the native SysIPAddress32 control because I couldn't get it to behave properly in VS.

I have some suggestions :
- Property .Text of the control : replace blanks by "0" (in order to avoid we get "192..." for example). Really easy to do;
- There is some kind of little flickering when we move the parent window form. I couldn't get rid of it, I don't know where does it come from.

Thank you for your great control !
GeneralProblem under Vista with larger font sizes
StefanFrank
1:08 26 Jun '08  
It seems that under Windows Vista the IPAddressControl doesn't calculate the correct width if the user changes the default font size to a larger one via the control panel.
The last part of the IP address cannot be edited and is not visible in this case.
Any ideas to solve this problem?
GeneralRe: Problem under Vista with larger font sizes
Michael Chapman
4:25 26 Jun '08  
I don't have Vista, but I do not see any font change issues on XP. Do you get the same behavior using the demo project attached to this article? I just wrote a small application where I can change the font of just the Form, and then just the IPAddressControl. In both instances, the control was rendered according to the font size with no clipping of any field.

Henry David Thoreau wrote:
Beware of all enterprises that require new clothes.



GeneralRe: Problem under Vista with larger font sizes
StefanFrank
4:33 26 Jun '08  
The demo attached with this article produces the same problem.
With larger font sizes I meant other DPI settings in the control panel, especially 120 DPI.
It's the same effect as mentioned in "Problem with Control and 120DPI" from May 2005.
GeneralRe: Problem under Vista with larger font sizes
Michael Chapman
6:08 26 Jun '08  
OK, now I see what you're saying. It looks like it could be related to the AutoScaleMode property. The form defaults to AutoScaleMode.Font. If I use AutoScaleMode.Dpi within the control, the control (with a little modification) is sized so that all fields are visible. Are you using VS2005? If so, would you mind grabbing this dll and seeing if it's a step in the right direction? All fields are there, but the control itself is a little wider than I think it should be.

Henry David Thoreau wrote:
Beware of all enterprises that require new clothes.


modified on Thursday, June 26, 2008 5:36 PM

GeneralRe: Problem under Vista with larger font sizes
StefanFrank
6:23 26 Jun '08  
Yes, all parts of the IP address are visible now. The control itself is larger as normal as you mentioned above. It ends outside the form's right edge.
General[Message Deleted]
Michael Chapman
10:37 26 Jun '08  

GeneralRe: Problem under Vista with larger font sizes
StefanFrank
22:30 26 Jun '08  
Perfect! Well done, you did a great job. Thank you very much for your effort.
AnswerRe: Problem under Vista with larger font sizes
vincio77
4:57 23 Mar '09  
Hi,
after get the last version of control (Rev 36 for VS2005) I still have the problem.
I've try one tips that solves the problem.
In Function 'protected override void OnPaint' of the control I added at the end this line:
this.Font = new Font(SystemFonts.MessageBoxFont.Name, 8f, FontStyle.Regular, GraphicsUnit.Point);

What do you think about?
GeneralRe: Problem under Vista with larger font sizes
vincio77
22:51 23 Mar '09  
I've just downloaded the Rev44 and all works fine!!!

Thank you very much 4 all.
GeneralIPAddressControl -->public void Clear() need a Invoke
wangkuang5
17:12 22 May '08  
??? System.InvalidOperationException
Message="???????: ???????“FieldControl0”???????"
Source="System.Windows.Forms"
StackTrace:
? System.Windows.Forms.Control.get_Handle()
? System.Windows.Forms.Control.SendMessage(Int32 msg, Int32 wparam, Int32 lparam)
? System.Windows.Forms.TextBoxBase.set_Text(String value)
? System.Windows.Forms.TextBox.set_Text(String value)
? System.Windows.Forms.TextBoxBase.Clear()
? IPAddressControlLib.IPAddressControl.Clear() ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\FormControls\IPAddressControlLib\IPAddressControl.cs:?? 243
? IPAddressControlLib.IPAddressControl.Parse(String text) ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\FormControls\IPAddressControlLib\IPAddressControl.cs:?? 808
? IPAddressControlLib.IPAddressControl.set_Text(String value) ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\FormControls\IPAddressControlLib\IPAddressControl.cs:?? 225
? PlayerDeviceInitTool.Data2ObjectProcessor.GetNetInfoResponseProcessor(Byte[] packets) ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\Data2ObjectProcessor.cs:?? 339
? PlayerDeviceInitTool.DataProcessor.DataFilter(Byte[] packets) ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\DataProcessor.cs:?? 123
? PlayerDeviceInitTool.SocketStack.UDPSocketService.UDPDataReceived(IAsyncResult ar) ?? F:\DMT_WAN\PlayerDeviceInitTool\0521\PlayerDeviceInitTool\PlayerDeviceInitTool\SocketStack\UDPSocketService.cs:?? 124
? System.Net.LazyAsyncResult.Complete(IntPtr userToken)
? System.Net.ContextAwareResult.CompleteCallback(Object state)
? System.Threading.ExecutionContext.runTryCode(Object userData)
? System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
? System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
? System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
? System.Net.ContextAwareResult.Complete(IntPtr userToken)
? System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
? System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
? System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)


in my code,I've given a string from udp broadcast message that it received client IP address,
code : uictl.frmtcpip.ipAddressControlIP_address.Text = dsIPAddress;
when I written this, InvalidOperationException has happended.FieldControl.Clear() need a Invoke();


public void Clear()
{
foreach ( FieldControl fc in _fieldControls )
{
//need FieldControl Invoke
//if (fc.InvokeRequired) {
// FieldControlClear fcclear = new FieldControlClear();
// fcclear.Invoke();
//} else {
// fc.Clear();
//}
fc.Clear();
}
}

??

GeneralRe: IPAddressControl.Clear() needs an InvokeRequired
Michael Chapman
17:51 22 May '08  
According to MSDN, InvokeRequired "gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on."

The best solution is to coordinate all of the calls on the control to come from the thread that created the control. Otherwise you'll need to define a delegate in your code and then call Invoke on that.

      delegate void ClearCallback();

private void ThreadProcedure()
{
if ( ipAddressControl1.InvokeRequired )
{
ClearCallback c = new ClearCallback( ipAddressControl1.Clear );
Invoke( c );
}
else
{
ipAddressControl1.Clear();
}
}


Henry David Thoreau wrote:
Beware of all enterprises that require new clothes.



GeneralRe: IPAddressControl.Clear() needs an InvokeRequired
wangkuang5
19:07 22 May '08  
I've dealed at this way,could you give me more best ideas!


IPAddressControl.cs: Exception at

private void Parse( String text )
{
Clear();//this need invoke FieldControls .Clear()

if ( null == text )
{
return;
}

int textIndex = 0;

int index = 0;

for ( index = 0; index < _dotControls.Length; ++index )
{
int findIndex = text.IndexOf( _dotControls[index].Text, textIndex, StringComparison.Ordinal );

if ( findIndex >= 0 )
{
//this need invoke _fieldControls[index].Text
_fieldControls[index].Text = text.Substring( textIndex, findIndex - textIndex );
textIndex = findIndex + _dotControls[index].Text.Length;
}
else
{
break;
}
}

_fieldControls[index].Text = text.Substring( textIndex );
}

-------------------------------------------------------------------------------------
I 've written these code to deal:

in IPAddressControl.cs:
#region Public Methods

public void Clear()
{
foreach ( FieldControl fc in _fieldControls )
{
if (fc.InvokeRequired)
{
FieldControlClear fcclear = new FieldControlClear(Clear);
fc.Invoke(fcclear);
}
else
{
fc.Clear();
}
//fc.Clear();
}
}
delegate void FieldControlClear();


**************
in FieldControl class
overide Text property

delegate void SetText(string text);
delegate string GetString();
public override string Text
{
get
{
if ((base.Parent != null) && // Make sure that the container is already built
(base.Parent.InvokeRequired)) // Is Invoke required?
{
GetString getTextDel = delegate()
{
return base.Text;
};
string text = String.Empty;
try
{
// Invoke the SetText operation from the Parent of the ToolStripStatusLabel
text = (string)base.Parent.Invoke(getTextDel, null);
}
catch
{

}

return text;
}
else
{
return base.Text;
}
}

set
{
// Get from the container if Invoke is required
if ((base.Parent != null) && // Make sure that the container is already built
(base.Parent.InvokeRequired)) // Is Invoke required?
{
SetText setTextDel = delegate(string text)
{
base.Text = text;
};

try
{
// Invoke the SetText operation from the Parent of the ToolStripStatusLabel
base.Parent.Invoke(setTextDel, new object[] { value });
}
catch
{

}
}
else
base.Text = value;
}
}


-----------------------------------------------------------

so the problem is at IPAddressControl must have safe thread to invoke FieldControl 's
void Clear() and property Text

thanks all !

xixi

GeneralRe: IPAddressControl.Clear() needs an InvokeRequired
Michael Chapman
20:17 22 May '08  
First off, I find it next to impossible to read any code that is not wrapped with 'code block' tags. Does the code even compile? It doesn't look like it will.

And, secondly, Parse() is not a public method of IPAddressControl so you cannot be calling that directly from your code.

And, thirdly, you don't need to modify IPAddressControl at all. This control offers no guarantee of thread safety. Try using a TextBox instead of my control and you'll run into the same problem. Your code either needs to be redesigned to call IPAddressControl on the thread that created the control, or you need to define delegates for every method that you want to call from another thread and then Invoke() them. In the case of properties (i.e., Text) a wrapper method that calls from the control's handle creation thread must be used.

Something like this:
      // This method is called from the thread that created ipAddressControl1
//
private void SetIPAddressControlText( string text )
{
ipAddressControl1.Text = text;
}

delegate void SetTextCallback( string text );

private void ThreadProcedure()
{
if ( ipAddressControl1.InvokeRequired )
{
SetTextCallback c = new SetTextCallback( SetIPAddressControlText );
Invoke( c, new object[] { "127.0.0.1" } );
}
else
{
ipAddressControl1.Text = "127.0.0.1";
}
}
or this (if you don't want to define a wrapper method for the property):
      delegate void SetValueCallback( object component, object value );

private void ThreadProcedure()
{
string text = "127.0.0.1";

if ( ipAddressControl1.InvokeRequired )
{
PropertyDescriptor d = TypeDescriptor.GetProperties( ipAddressControl1 )[ "Text" ];

SetValueCallback c = new SetValueCallback( d.SetValue );

Invoke( c, new object[] { ipAddressControl1, text } );

return;
}

ipAddressControl1.Text = text;
}


Henry David Thoreau wrote:
Beware of all enterprises that require new clothes.



Last Updated 28 Apr 2008 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010