Recently I have implemented DevExpress BreadCrumbEdit control in my application and in the implementation I need to disable editing of the path in the control. In technical words, I need BreadCrumbEdit control in only Select mode rather the Edit Mode. Initially it can be set using the BreadCrumbEdit’s BreadCrumbMode property to “Select”.
I found one solution that it is impossible to prevent switching to the Edit mode. The easiest way DevExpress guys suggest that handle the BreadCrumbEdit's PropertiesChanged event and reset it back to “Select” if it try to go in the “Edit” mode. So I did it in the following manner:
C#
private void breadCrumbEdit1_PropertiesChanged(object sender, EventArgs e)
{
if (breadCrumbEdit1.Properties.BreadCrumbMode == BreadCrumbMode.Edit)
{
breadCrumbEdit1.Properties.BreadCrumbMode = BreadCrumbMode.Select;
}
}
VB
Private Sub breadCrumbEdit1_PropertiesChanged(sender As Object, e As EventArgs)
If breadCrumbEdit1.Properties.BreadCrumbMode = BreadCrumbMode.Edit Then
breadCrumbEdit1.Properties.BreadCrumbMode = BreadCrumbMode.Select
End If
End Sub
Related to: Close a MessageBox after several seconds.
Scenario:
I need to create a message box or Popup which must be visible for specified time and close automatically after then.
Solution:
There is not inbuilt feature in .net framework to do this. You need to create your custom logic that message box close after a specific time. To do this create a custom message box class which have a timer which close the raised pop message when elapsed time equal to specified time to make it visible to the user.
Here is the custom class:
public class AutoClosingMessageBox {
System.Threading.Timer _timeoutTimer;
string _caption;
AutoClosingMessageBox(string text, string caption, int timeout) {
_caption = caption;
_timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
null, timeout, System.Threading.Timeout.Infinite);
MessageBox.Show(text, caption);
}
public static void Show(string text, string caption, int timeout) {
new AutoClosingMessageBox(text, caption, timeout);
}
void OnTimerElapsed(object state) {
IntPtr mbWnd = FindWindow(null, _caption);
if(mbWnd != IntPtr.Zero)
SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
_timeoutTimer.Dispose();
}
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
It can be called as below:
AutoClosingMessageBox.Show("Text", "Caption", 1000);
Scenario:
Current requirement is that user can select option from drop down from mouse selection only, but whenever use type anything in the drop down it automatically raise control’s ComboBox.SelectionChangeCommitted event with first match that satisfies auto complete condition of the control. As required we need ignore the key press to raise the ComboBox.SelectionChangeCommitted event of the combo box and it only allow selection only on mouse.
Solution:
To do this, I set the control’s DropdownStyle set to DropDownList, but no work correctly. Along this I have to suppress combo box’s key press by handling KeyDown event as below.
LibraryListDropdown libDropdown = null;
public Form1()
{
InitializeComponent();
libDropdown = new LibraryListDropdown();
this.libDropdown.DropDownStyle = DropDownStyle.DropDownList;
libDropdown.Name = "cmbObjectType";
libDropdown.SelectionChangeCommitted += new EventHandler(libDropdown_SelectionChangeCommitted);
libDropdown.KeyDown += libDropdown_KeyDown;
this.Controls.Add(libDropdown);
libDropdown.PopulateLibraries();
}
void libDropdown_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}
private void libDropdown_SelectionChangeCommitted(object sender, EventArgs e)
{
}
You have to use interop to to send request to windows that show DataTimePicker
on click of the button
//include namespace section
using System.Runtime.InteropServices;
//declares
[DllImport("user32.dll")]
private static extern bool PostMessageForCalender(
IntPtr hWnd, // handle to destination window
Int32 msg, // message
Int32 wParam, // first message parameter
Int32 lParam // second message parameter
);
const Int32 WM_LBUTTONDOWN = 0x0201;
//method to call calender dropdown
private void button1_Click(object sender, EventArgs e)
{
Int32 x = dateTimePicker1.Width - 10;
Int32 y = dateTimePicker1.Height / 2;
Int32 lParam = x + y * 0x00010000;
PostMessageForCalender(dateTimePicker1.Handle, WM_LBUTTONDOWN, 1,lParam);
}