Aslında bu soruna birkaç makul çözüm var. Bir MSDN forumu iki olasılık, nobugz ve bir tane de agrobler içeren bir ComboBox Item highlight event mesajına sahiptir. Bunların her biri, ComboBox açılır menüsündeki her bir öğenin araç ipuçlarını ele alması gereken bir ComboBox alt sınıfına kod sağlar. Agrobler'in çözümü, bazı güzel çizimler içerdiği için, daha cilalı görünüyor, ancak maalesef kontrolün önemli ToolTipMember özelliğini nasıl dolduracağımız net değil (en azından benim için).
Her iki çözüm de, tek tek öğelere atanan isteğe bağlı araç ipuçlarına izin veriyor gibi görünüyor. Daha spesifik, ancak daha yaygın olan bir durum, ComboBox'un genişliğini sığmayacak kadar uzun olan öğelerin olabileceğini bildiğinizde, araç ipucunun öğenin metnini yansıtmasını istediğiniz yerdir. Kendi durumumda, tam dosya yollarını tutan bir ComboBox örneğim var, bu nedenle içeriğin ComboBox'ın genişliğini aşabileceğini görmek kolay.
Zhi-Xin Ye, MSDN forumu Windows Dropdown question'da, bu daha özel sorunu gideren ve çok daha basit bir çözüm sağlar. Kodu bütünüyle burada yeniden yapıyorum. (Bu kodun Form1 adında bir Form oluşturulan ve işleyici gösterilen yükü bağladım ve ayrıca comboBox1 adlı ComboBox ve bir araç ipucu işleyicisi toolTip1 eklemiş önceden varsayar unutmayın.)
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
}
void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
string text = this.comboBox1.GetItemText(comboBox1.Items[e.Index]);
e.DrawBackground();
using (SolidBrush br = new SolidBrush(e.ForeColor))
{ e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{ this.toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
else { this.toolTip1.Hide(comboBox1); }
e.DrawFocusRectangle();
}
basit ve özlü, bu kodun iken bir kusurdan muzdarip (yukarıdaki MSDN iş parçacığına bir yanıtta belirtildiği gibi): fareyi bir tıklatma öğesinden diğerine (tıklamadan) hareket ettirdiğinizde, yalnızca her diğer biri kalıcı bir ipucu gösterir! düzeltme, yalnızca bu iş parçacığı üzerinde bir başka girişle ima, yüzden tam sağlanması yararlı olacaktır düşünülmektedir, kodu buraya düzeltilmiş:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DrawItem += comboBox1_DrawItem;
comboBox1.DropDownClosed += comboBox1_DropDownClosed;
}
private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
toolTip1.Hide(comboBox1);
}
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0) { return; } // added this line thanks to Andrew's comment
string text = comboBox1.GetItemText(comboBox1.Items[e.Index]);
e.DrawBackground();
using (SolidBrush br = new SolidBrush(e.ForeColor))
{ e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{ toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
e.DrawFocusRectangle();
}
birkaç kod gereksiz kısımlarını çıkararak yanında (örneğin, "bu "niteleyici" birincil fark, toolTip1.Hide çağrısı DropDownClosed olay işleyicisine taşınmaktır. DrawItem işleyiciden çıkartmak yukarıda belirtilen kusuru ortadan kaldırır; ancak açılır kapanır kapanmaz, aksi takdirde son görüntülenen araç ipucu ekranda kalır.
2012.07.31 Zeyilname Sadece Kitaplığımı kullanırsanız size hiç yazmak için hiçbir kod var bu nedenle bu ipucu kapasitesini içeren bir kompozit ComboBox oluşturulan beri var olduğunu hatırlatmak istedik. Sadece bir ComboBoxWithTooltip'i Visual Studio tasarımcısına sürükleyin ve işiniz bitti. Başlamak için API page veya download açık kaynak kodlu C# kitaplığımdaki ComboBoxWithTooltip'e aşağıya inin. (Yakalanan Andrew hatası için yama, yakında çıkacak 1.1.04 sürümünde olacak.)
Nasıl do iki sütunlu bir combo yapmak? –
Etrafında birkaç ücretsiz olanlar var. Bunu kod projesinde buldum ama kullanmadım ve ne kadar iyi olduğuna dair yorum yapamam: http://www.codeproject.com/KB/cpp/multicolumncombo.aspx –
Bunun sıra dışı olduğunu düşünmüyorum hiç Ortak durum, öğenin metninin çok uzun olması ve dizenin kuyruğunu göremiyor olmanızdır. Bir araç ipucu, öğeyi görüntülemenin çok açık bir yoludur. İki sütunlu bir combo, rahatsız ve korkunç geliyor. – Andrew