2016-12-10 6 views
1

Я пытаюсь отобразить пустое текстовое сообщение внутри списка, когда у меня нет элементов внутри него (это когда форма инициализируется).Показать пустой текст, когда в элементах формы ListView нет элементов

Я попытался искать другой метод, из которых один использует OnPaint() событие `, но это не сработало хорошо ...

Может кто-нибудь помочь мне? ` Edit: это один из методов, которые я пробовал:

protected override void WndProc(ref Message m) 
     { 
      base.WndProc(ref m); 
      if (m.Msg == 20) 
      { 
       if (this.Items.Count == 0) 
       { 
        _b = true; 
        Graphics g = this.CreateGraphics(); 
        int w = (this.Width - g.MeasureString(_msg, 
         this.Font).ToSize().Width)/2; 
        g.DrawString(_msg, this.Font, 
         SystemBrushes.ControlText, w, 30); 
       } 
       else 
       { 
        if (_b) 
        { 
         this.Invalidate(); 
         _b = false; 
        } 
       } 
      } 

      if (m.Msg == 4127) this.Invalidate(); 
     } 
+0

Вы забыли проверить значение null и если Items.Count <0? Счетчик элементов будет равен -1, если конструктор формы выполнит, и ваш код может получить вызов в течение этого времени. Если всегда проверяйте, меньше ли счет элемента управления, чем ноль, чтобы исключить исключения, когда выполняется конструктор формы. – jdweng

+0

@jdweng Да, я проверил это, по какой-то причине это вообще не работает .. Вот почему я ищу другой метод для отображения пустого текста – User987

+0

Вы получаете исключение? – jdweng

ответ

1

Вы можете обрабатывать WM_PAINT(0xF) сообщений и проверить, если нет ни одного пункта в Items коллекции, нарисовать строку в центре вашего ListView. Например:

using System.Windows.Forms; 
using System.ComponentModel; 
using System.Drawing; 

public class MyListView : ListView 
{ 
    public MyListView() 
    { 
     EmptyText = "No data available."; 
    } 
    [DefaultValue("No data available.")] 
    public string EmptyText { get; set; } 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == 0xF) 
     { 
      if (this.Items.Count == 0) 
       using (var g = Graphics.FromHwnd(this.Handle)) 
        TextRenderer.DrawText(g, EmptyText, Font, ClientRectangle, ForeColor); 
     } 
    } 
} 
+0

Как бы реализовать это в форме при отображении элементов в форме? – User987

+0

P.S. Причина, по которой я спрашиваю об этом, состоит в том, что список, который у меня есть в форме, просто перетаскивается, а затем используется в коде позади, поэтому я совершенно уверен, как использовать этот код для его объединения? :) – User987

+0

Это новый элемент управления MyListView, который получен из 'ListView'. Поэтому, когда вы добавили этот элемент управления в свой проект, вы можете удалить его экземпляр из панели инструментов в свою форму и использовать его, как и любой другой элемент управления. –

 Смежные вопросы

  • Нет связанных вопросов^_^