none
treeview бага со скроллингом RRS feed

  • Общие обсуждения

  • Здравствуйте!
    Использую treeview, в котором ноды отличаются по высоте. Для этого использую функцию HeiNode которую при необходимости вызываю при добавлении нодов (код функции приведен ниже). Но в этом случае, если делать скроллинг в конец списка, последний нод будет виден не весь, в сам скролл невозможно опустить до конца (он автоматически "подпрыгивает" чуть выше). Если руками увеличить высоту самой формы - то все становиться нормально.
    Подскажите, пожалуйста, как бороться с этой проблемой!
    В примере ниже, для упрощения, высота всех нодов увеличивается в 5 раз.
    Главная форма, где происходит добавление нодов:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        My_tree_view mtv = new My_tree_view();
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          
         mtv.Visible = true;
         this.Controls.Add(mtv);
         mtv.BeginUpdate();
         for (int i = 0; i < 20; i++)
         {
           TreeNode tn = new TreeNode("node" + i.ToString());
           tn.Name = "node" + i.ToString();
           mtv.Nodes.Add(tn);
    
           mtv.HeiNode(tn.Handle.ToInt32());
    
    
    
         }
         mtv.EndUpdate();
      
        }
        
    
       
      }
    }
    


    Вот класс моего treeview:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Runtime.InteropServices;
    
    namespace WindowsFormsApplication1
    {
      class My_tree_view : System.Windows.Forms.TreeView
      {
        public My_tree_view():base()
        {
        this.Visible = true;
         
          this.Scrollable = true;
          this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
          this.BorderStyle = BorderStyle.Fixed3D;
          this.FullRowSelect = true;
          this.HideSelection = false;
          this.Dock=DockStyle.Fill;
          this.ShowPlusMinus = false;
          this.ShowRootLines = false;
          this.ItemHeight = 17;
        
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
        public struct TVITEM
        {
          public uint mask;
          public IntPtr hItem;
          public uint state;
          public uint stateMask;
          public IntPtr pszText;
          public int cchTextMax;
          public int iImage;
          public int iSelectedImage;
          public int cChildren;
          public IntPtr lParam;
          public int iIntegral;
    
        }
        public enum TVIF : int
        {
          TVIF_TEXT = 0x0001,
          TVIF_IMAGE = 0x0002,
          TVIF_PARAM = 0x0004,
          TVIF_STATE = 0x0008,
          TVIF_HANDLE = 0x0010,
          TVIF_SELECTEDIMAGE = 0x0020,
          TVIF_CHILDREN = 0x0040,
          TVIF_INTEGRAL = 0x0080
        }
        public enum TreeViewMessages : int
        {
          TV_FIRST = 0x1100,   // TreeView messages
          TVM_SETITEM = (TV_FIRST + 13),
          TVM_SETITEMHEIGHT = (TV_FIRST + 27)
        }
        public void HeiNode(int hItem)
        {
          if (hItem > 0)
          {
            TVITEM tvi = new TVITEM();
            tvi.mask = (uint)TVIF.TVIF_HANDLE | (uint)TVIF.TVIF_INTEGRAL;
            tvi.hItem = new IntPtr(hItem);
            tvi.stateMask = (uint)TVIF.TVIF_INTEGRAL;
            tvi.state = 0;
    
            tvi.iIntegral = 5;
    
            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
    
            try
            {
              Marshal.StructureToPtr(tvi, ptr, false);
              Message msg = Message.Create(this.Handle, (int)TreeViewMessages.TVM_SETITEM, IntPtr.Zero, ptr);
              DefWndProc(ref msg);
            }
            finally
            {
              Marshal.FreeHGlobal(ptr);
            }
          }
        }
        private void InitializeComponent()
        {
          this.SuspendLayout();
          // 
          // My_tree_view
          // 
           this.ResumeLayout(false);
    
        }
        
        
        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
        {
          Rectangle rec = e.Bounds;
          e.Graphics.FillRectangle(Brushes.Aqua, rec);
          e.Graphics.DrawRectangle(Pens.Black, rec.X, rec.Y, rec.Width, rec.Height - 2);
          e.Graphics.DrawString(e.Node.Name, new Font("Times", 12f,FontStyle.Bold),Brushes.Black,new PointF(rec.X+10,rec.Y+5));
          base.OnDrawNode(e);
          
        }
        
      }
    }
    
    Заранее спасибо!)

     

    • Изменен тип I.Vorontsov 5 июля 2010 г. 5:13
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 21:24 MSDN Forums consolidation (От:Разработка Windows-приложений)

Все ответы

  • В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме.
    Для связи [Mail]
    1 июля 2010 г. 13:26