Winform Interview Questions Page 4
Page 1Page 2Page 3Page 4Page 5
How would I change the icon that appears on the toolbox for a custom control?

You can do this in different ways explained below. In all the cases the bitmap or icon should follow these rules:
* The bitmap or icon dimension should be 16X16 with 16 colors.
* The left-bottom pixel-color will be assumed to be the transparent color.
Technique 1: Use a bitmap (not an icon, in the embedded resource) file implicitly without specifying the ToolboxBitmapAttribute for the type:
Say, you have a custom control MyControl in the namespace MyNamespace, create a bmp file MyControl.bmp following the above rules. Add this file to your project at the top-level and make it an embedded resource. The project's default namespace should be MyNamespace. If the control's namespace and the project's default namespace don't match then move the bitmap to appropriate subfolders so that they match. If this is not possible, typically when the namespaces are not related at all then you cannot use this technique, use instead one of the techniques below using the ToolboxBitmap attribute.

Create the assembly and the next time you add it to the toolbox the custom image in MyControl.bmp should be available in the toolbox.

This is the easiest technique to implement as it doesn't require you to use the ToolboxBitmapAttribute in your type defenition.

Technique 2: Use ToolboxBitmap attribute.

Example 1:

Use a bitmap (not icon) in the embedded resource with the same name as the type.

Default Assembly Namespace: "MyAssemblyNamespace"

namespace MyAssemblyNamespace

{

[ToolboxBitmap(typeof(MyCustomType))]

public class MyCustomType : Component

{...}


}

In the above scenario the runtime will look for a embedded bmp file of name MyCustomType.bmp in the project's root directory. Note that the default namespace and the type's namespace match.

Example 2:

If you want your icons in sub-directories then change the attribute like this:



[ToolboxAttribute(typeof(MyCustomType), "ToolboxIcons.MyCustomType.bmp")]



or



[ToolboxAttribute(typeof(MyCustomType), "ToolboxIcons.MyCustomType.ico")]



where the bmp or ico file (yap, now, when you explicity specify the resource, you can use an ico file) is in a sub-directory called "ToolboxIcons".

Example 3:

Sometimes your type's namespace and the default assembly namespace may be unrelated, in which case you have to use a different type that has the same namespace as the default assembly namespace to scope the embedded image file.

Default namespace: "MyAssemblyNamespace"



namespace MyAssemblyNamespace



{



public class SomeType



{...}



}



namespace DifferentNamespace



{



// Using SomeType which has the same namespace as the default assembly namespace to scope the embedded resource.



[ToolboxBitmap(typeof(SomeType), "MyCustomType.ico")]



public class MyCustomType



{...}



}



In this case the runtime will look for the above resource at the top-most directory. If your icons were in a subdirectory named "ToolboxIcons" then the attribute would look like this:



[ToolboxBitmap(typeof(SomeType), "ToolboxIcons.MyCustomType.ico")]







2.15 A control's Validating event is hit even when the user clicks on the Close box. How can I avoid this behavior?



One way is to add code to your Validating handler and only execute the validation routine if the mouse is in the client area. This will avoid the click on the title bar and its system menu. You might also want to add special handling for the tab key so your validation is hit independent of the mouse location when you tab off the control.



private bool tabKeyPressed = false;







private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e)



{



if(tabKeyPressed ||



this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))



{



if(boolNotOKValues) //do your validating



e.Cancel = true; //failed



}



tabKeyPressed = false;



}







protected override bool ProcessDialogKey(Keys keyData)



{



tabKeyPressed = keyData == Keys.Tab;



return base.ProcessDialogKey(keyData);



}







2.16 I would like to prevent validation in my textbox when the user clicks on my Cancel button, how do I do this?



Say textBox1 and canelButton and the control names, then this is how you could do this:



[C#]



// Handler to the Validating event of the TextBox.



private void TextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)



{



if (!this.cancelButton.Focused)



{



// Do this only when the cancel button is not clicked.



if(invalidState)



e.Cancel = true;



}



}



[VB.Net]



' Handler to the Validating event of the TextBox.



Private Sub TextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)



If Not Me.cancelButton.Focused Then



' Do this only when the cancel button is not clicked.



If invalidState Then



e.Cancel = True



End If



End If



End Sub