sticky
Windows Forms General 常见问题 RRS feed

全部回复

  •    

    1.1如何在重新加载TreeView后仍然保持TreeView原有的展开状态?  [回到顶端]

     

    要获得树的整个展开的状态比较困难,但是我们可以只刷新树中节点(node)的内容来实现这种功能。如果需要保存一些数据的关联信息,可以存储在TreeNode.Tag属性中。

      

    代码:

    private Hashtable _nodesByValueMember = new Hashtable();// 存储所有的树节点

    private void Form4_Load(object sender, EventArgs e)

    {

        DataTable dt = new DataTable();

        dt.Columns.Add("ID", typeof(int));

        dt.Columns.Add("IDParent", typeof(int));

        dt.Columns.Add("Name", typeof(string));

        dt.Rows.Add(new object[] { 1, 2, null });

        dt.Rows.Add(new object[] { 2, 0, "Sports News" });

        dt.Rows.Add(new object[] { 3, 2, "Rugby" });

        dt.Rows.Add(new object[] { 4, 1, "Amateur Soccer" });

        dt.Rows.Add(new object[] { 5, 1, "Proffesional Soccer" });

        dt.Rows.Add(new object[] { 6, 0, "International News" });

        dt.AcceptChanges();

     

        this.treeView1.Nodes.Clear();

     

        binding(dt);

     

        this.dataGridView1.DataSource = dt;// DataGridView用来修改树节点的内容

        this.dataGridView1.Columns[0].Visible = false;

        this.dataGridView1.Columns[1].Visible = false;

        this.dataGridView1.AllowUserToAddRows = false;

    }

     

    private void binding(DataTable dt)

    {

        foreach (DataRow dr in dt.Rows)

        {

            TreeNode node = new TreeNode(dr["name"].ToString());

            node.Name = dr["ID"].ToString();

            node.Tag = dr["IDParent"];

     

            _nodesByValueMember.Add(node.Name, node);

        }

     

        foreach (TreeNode node in _nodesByValueMember.Values)

        {

            if (node.Tag.ToString() == "0")

            {

                //如果节点是根节点,添加到根集合中

                this.treeView1.Nodes.Add(node);

            }

            else

            {

                //寻找父节点

                TreeNode parent = (TreeNode)_nodesByValueMember[node.Tag.ToString()];

                if (parent != null)

                {

                    //添加到父节点的节点集合中

                    parent.Nodes.Add(node);

                }

                else

                {

                    throw new ArgumentException("Node with Value = " + Convert.ToString(node.Tag) + " does not exist. The referencing node has a value = " + Convert.ToString(node.Tag) + ". Check your datasource integrity.");

                }

            }

        }

    }

     

    private void btnrefresh_Click(object sender, EventArgs e)

    {

        //刷新节点的文本

        DataTable dt = (DataTable)this.dataGridView1.DataSource;

        foreach (DataRow dr in dt.Rows)

        {

            TreeNode node = (TreeNode)_nodesByValueMember[dr["ID"].ToString()];

            node.Text = dr["Name"].ToString();

        }

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/0c54e129-e5e5-4021-a1ac-26135fbd1f06/

     

    2009年7月8日 13:05
  •  

    1.2如何在TreeView中分层次的显示数据?  [回到顶端]

     

    首先,需要为所有的数据创建树节点(tree node,然后用哈希表(hash table)存储这些树节点(tree node,最后遍历整张哈希表(hash table)根据存储的信息分层次地给TreeView添加树节点。请参考以下代码:

      

    代码:

    namespace TreeView

    {

        public partial class BindingTreeView : Form

        {

            public BindingTreeView()

            {

                InitializeComponent();

            }

            private Hashtable _nodesByValueMember = new Hashtable();// 存储所有的树节点

            private void BindingTreeView_Load(object sender, EventArgs e)

            {

                DataTable dt = new DataTable();

                dt.Columns.Add("ID", typeof(int));

                dt.Columns.Add("IDParent", typeof(int));

                dt.Columns.Add("Name", typeof(string));

                dt.Rows.Add(new object[] { 1, 2, null });

                dt.Rows.Add(new object[] { 2, 0, "Sports News" });

                dt.Rows.Add(new object[] { 3, 2, "Rugby" });

                dt.Rows.Add(new object[] { 4, 1, "Amateur Soccer" });

                dt.Rows.Add(new object[] { 5, 1, "Proffesional Soccer" });

                dt.Rows.Add(new object[] { 6, 0, "International News" });

                dt.AcceptChanges();

     

                this.treeView1.Nodes.Clear();

     

                binding(dt);

            }

     

            private void binding(DataTable dt)

            {

                foreach (DataRow dr in dt.Rows)

                {

                    TreeNode node = new TreeNode(dr["name"].ToString());

                    node.Name = dr["ID"].ToString();

                    node.Tag = dr["IDParent"];

     

                    _nodesByValueMember.Add(node.Name, node);

                }

     

                foreach (TreeNode node in _nodesByValueMember.Values)

                {

                    if (node.Tag.ToString() == "0")

                    {

                        //如果节点是根节点,添加到根集合中

                        this.treeView1.Nodes.Add(node);

                    }

                    else

                    {

                        //寻找父节点

                        TreeNode parent = (TreeNode)_nodesByValueMember[node.Tag.ToString()];

                        if (parent != null)

                        {

                            //添加到父节点的节点集合中

                            parent.Nodes.Add(node);

                        }

                        else

                        {

                            throw new ArgumentException("Node with Value = " + Convert.ToString(node.Tag) + " does not exist. The referencing node has a value = " + Convert.ToString(node.Tag) + ". Check your datasource integrity.");

                        }

                    }

                }

            }

        }

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/e32ef246-fbb3-4432-9439-0027f2441c6a/

      

    2009年7月8日 13:39
  •   

    1.3如何在两个TreeView之间实现数据拖拽?  [回到顶端]

     

    Microsoft.Windows.Forms newsgrop的一个帖子中,Brian Roder(Microsoft)给出如何通过处理DragEnterItemDragDragDrop事件来解决这个问题的VB.NET代码。以下是C#版本的示例。

     

    代码:

    private void treeView2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)

    {

        TreeNode newNode;

        if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))

        {

            Point pt;

            TreeNode destinationNode;

            pt = treeView2.PointToClient(new Point(e.X, e.Y));

            destinationNode = treeView2.GetNodeAt(pt);

            newNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");

            if (!destinationNode.Equals(newNode))

            {

                //destinationNode.Nodes.Add(newNode.Clone());

                destinationNode.Nodes.Add((TreeNode)newNode.Clone());

                destinationNode.Expand();

                //移除原始的节点

                newNode.Remove();

            }

        }

    }

     

    private void treeView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)

    {

        e.Effect = DragDropEffects.Move;

    }

     

    private void treeView2_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)

    {

        DoDragDrop(e.Item, DragDropEffects.Move);

    }

     

    2009年7月8日 13:40
  •  

    1.4如何在TreeViewCheckBoxes属性设置为true时隐藏子节点的CheckBox  [回到顶端]

     

    要实现这种功能,必须重新绘制树节点(tree node)。我们可以设置TreeView.DrawMode属性为OwnerDrawAll并处理DrawNode事件。请参考以下代码:

      

    代码:

    private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)

    {

        if (IsThirdLevel(e.Node))

        {

            Color backColor, foreColor;

            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)

            {

                backColor = SystemColors.Highlight;

                foreColor = SystemColors.HighlightText;

            }

            else if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)

            {

                backColor = SystemColors.HotTrack;

                foreColor = SystemColors.HighlightText;

            }

            else

            {

                backColor = e.Node.BackColor;

                foreColor = e.Node.ForeColor;

            }

     

            using (SolidBrush brush = new SolidBrush(backColor))

            {

                e.Graphics.FillRectangle(brush, e.Node.Bounds);

            }

     

            TextRenderer.DrawText(e.Graphics, e.Node.Text, this.treeView.Font, e.Node.Bounds, foreColor, backColor);

     

            if ((e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused)

            {

                ControlPaint.DrawFocusRectangle(e.Graphics, e.Node.Bounds,

                foreColor, backColor);

            }

            e.DrawDefault = false;

        }

        else

        {

            e.DrawDefault = true;

        }

    }

     

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/947aaded-6372-4253-8799-2b595f4a39b9/

     

    2009年7月8日 13:41
  •  

    2.1如何在RichTextBox中通过编程将光标定位到特定的行和字符?  [回到顶端]

     

    RichTextBox控件有一个Lines属性,该属性是数组类型,它的每一项对应着RichTextBox控件中的一行。每一项都有对应行的Length属性。那么我们就可以像这样来设置光标:

     

    private void GoToLineAndColumn(RichTextBox rtb, int line, int column)

    {

        rtb.Focus();

        if (line < 0 || column < 0)

        {

            rtb.SelectionStart = 0;

        }

        else

        {

            if (line > rtb.Lines.Length - 1)

            {

                rtb.SelectionStart = rtb.GetFirstCharIndexFromLine(rtb.Lines.Length - 1)

                  + rtb.Lines[rtb.Lines.Length - 1].Length;

            }

            else

            {

                int firstCharIndexOfline = rtb.GetFirstCharIndexFromLine(line);

                int textlengthOfline;

                textlengthOfline = rtb.Lines[line].Length;

                if (column > textlengthOfline)

                    column = textlengthOfline;

                rtb.SelectionStart = firstCharIndexOfline + column;

            }

        }

    }

     

    2009年7月8日 13:41
  •  

    2.2如何将RTF控件中RTF格式的数据保存到SQL Server中?  [回到顶端]

     

    有一个比较简单的方法,我们只需要将其绑定到RichTextBox,然后再更新到数据源。注意,这里是将其绑定到Rtf属性,不是text属性。

     

    代码:

    Binding bd = new Binding("Rtf", dt, "descs", true);

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/8dd30768-0900-488a-a545-d8af01b78f39/

      

    2009年7月8日 13:42
  •   

    2.3如何在RichTextBox中获取当前字符的颜色?  [回到顶端]

     

    RichTextBox提供了SelectionColor的属性;我们可以使用这个属性来获取当前字符的颜色。

      

    代码:

    private void richTextBox1_MouseMove(object sender, MouseEventArgs e)

    {

        int index = richTextBox1.GetCharIndexFromPosition(e.Location);

        richTextBox1.SelectionStart = index;

        label1.Text = richTextBox1.SelectionColor.ToString();

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/1418c7f4-fc35-464f-8584-b001ceaef60a/

      

    2009年7月8日 13:42
  •   

    2.4如何在RichTextBox中实现平滑滚动?  [回到顶端]

      

    这就需要用到两个windows API函数:GetScrollPosPostMessageGetScrollPos用来获取RichTextBox的当前位置,PostMessage在这里则是用来向创建当前窗口的线程的消息队列发送垂直滚动(WM_VSCORLL)消息。

      

    代码:

        <Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="PostMessage")> _

        Public Shared Function PostMessage(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

        End Function

     

        <Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetScrollPos")> _

        Public Shared Function GetScrollPos(ByVal hwnd As Integer, ByVal nBar As Integer) As Integer

        End Function

     

        Public Const WM_VSCROLL As Integer = 277

        Public Const SB_THUMBPOSITION As Integer = 4

        Public Const SBS_VERT As Integer = 1

     

        Private previousPos As Integer = 0

     

        Private Sub RTBAutoScroll_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

            Me.RichTextBox1.[Select](0, 0)

            Me.RichTextBox1.ScrollToCaret()

            Me.Timer1.Interval = 300

            AddHandler Me.Timer1.Tick, AddressOf timer1_Tick

     

            Dim td As New DateTime()

            Me.Text = td.ToString()

        End Sub

     

        Private Sub timer1_Tick(ByVal sender As Object, ByVal e As EventArgs)

            Dim currentPos As Integer = GetScrollPos(CInt(Me.richTextBox1.Handle), SBS_VERT)

            If previousPos <> currentPos OrElse currentPos = 0 Then

                previousPos = currentPos

                PostMessage(CInt(Me.richTextBox1.Handle), WM_VSCROLL, SB_THUMBPOSITION + 65536 * (currentPos + 1), 0)

            End If

        End Sub

     

        Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            If Button1.Text = "Auto Scroll" Then

                Button1.Text = "Pause"

                Timer1.Enabled = True

            ElseIf Button1.Text = "Pause" Then

                Button1.Text = "Auto Scroll"

                Timer1.Enabled = False

            End If

        End Sub

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/151741bb-dd93-48ff-b0cc-6b05dd8811e1/

     

    2009年7月8日 13:43
  •  

    2.5如果RichTextBox控件中包含图片和文字,当选中图片时,是否可以检测到?  [回到顶端]

      

    RTF格式规范规定图片信息都是以\pict控制字码开头。当点击RichTextBox时,我们可以通过判断选中的Rtf字符串是否包含\pict来检测是否点击在图片上。请参考以下代码:

      

    代码:

    this.richTextBox1.MouseClick += new MouseEventHandler(richTextBox1_MouseClick);

     

    void richTextBox1_MouseClick(object sender, MouseEventArgs e)

    {

        if (this.richTextBox1.SelectedRtf.IndexOf(@"\pict") != -1 &&

            this.richTextBox1.SelectionType == RichTextBoxSelectionTypes.Object)

        {

            MessageBox.Show("Image has been clicked!");

        }

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/368cf6cf-ef49-4612-89f7-94745e2d84a9/

      

    2009年7月8日 13:44
  •   

    2.6如何让TextBox只接受数字输入?  [回到顶端]

      

    我们可以通过处理文本框的KeyPress事件来判断输入的字符是否是是数字。接下来的示例演示了只接受数字(和控制字符例如Backspace)的自定义TextBox

      

    代码;

    public class NumbersOnlyTextBox : TextBox

    {

        protected override void OnKeyPress(KeyPressEventArgs e)

        {

            base.OnKeyPress(e);

            if (!(char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar)))

                e.Handled = true;

        }

    }

     

    2009年7月8日 13:44
  •  

    3.1如何将一个ComboBox绑定到table上?  [回到顶端]

     

    在数据绑定的应用程序中,ComboBox一个常见的用法就是作为提供给用户查找信息的控件。从数据源的角度来说,可查找的用户控件可以用来提供“查询”外键的值。例如,假设你有一张包含“StateID”的用户表,“StateID”是“States”表的外键。从用户的角度上讲,开发者会希望用户通过ComboBox来选择State而不是StateID。要实现这种功能,我们可以用复杂绑定(Complex Binding)将ComboBox绑定到States表(设置ComboBox.DisplayMemberComboBox.ValueMember)。

      

     代码:

    Customer cust = new Customer("Joe", "WA");

    this.statesCB.DisplayMember = "Name";

    this.statesCB.ValueMember = "Code";

    this.statesCB.DataSource = statesTable;

    this.statesCB.DataBindings.Add("SelectedValue", cust, "StateID", true);

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/afea4d0c-3110-46cc-8b43-7312020a093d/

     

    2009年7月8日 13:45
  •  

    3.2如何在ComboBox中添加‘please select’项?  [回到顶端]

      

    如果ComboBox是非绑定,我们可以直接添加一项到ComboBox的项集合中。

      

    代码:

    this.comboBox1.Items.Insert(0, "please select");

    this.comboBox1.SelectedIndex = 0;

      

    如果ComboBox是数据绑定的,我们就需要将这一项添加到数据源中。

      

    代码:

    Customer cust = new Customer("Joe", null);

     

    DataRow row = statesTable.NewRow();

    row["Name"] = " please select";

    row["Code"] = DBNull.Value;

    statesTable.Rows.Add(row);

    this.statesCB.DisplayMember = "Name";

    this.statesCB.ValueMember = "Code";

    this.statesCB.DataSource = statesTable;

     

    this.statesCB.DataBindings.Add("SelectedValue", cust, "StateID", true);

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/380f964a-4060-4dff-b99f-106372a1bac9/

     

    2009年7月8日 13:45
  •  

    3.3如何使ComboBox的下拉框足够宽以显示项中所有的字符?  [回到顶端]

      

    我们可以通过设置ComboBoxDropDownWidth来实现。

     

    代码:

    string s = "this is a really, really, really, really, really, long string";

    Graphics g = Graphics.FromHwnd(this.Handle);

    SizeF size = g.MeasureString(s, comboBox1.Font);

    comboBox1.DropDownWidth = Convert.ToInt32(size.Width);

    this.comboBox1.Items.Add(s);

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/e770affd-afee-4892-a8d2-c5fc8bd07a3d/

     

    2009年7月8日 13:46
  •  

    4.1如何让ListBox中的各项单独显示tooltip  [回到顶端]

     

    首先创建一个方法用来处理鼠标移动事件,创建一个ToolTip实例作为窗体的动态成员用来显示鼠标指示的当前项的信息,然后将它与ListBoxMouseMove事件关联。请参考以下代码:

      

    代码:

    private void onMouseMove(object sender, MouseEventArgs e)

    {

        if (sender is ListBox)

        {

            ListBox listBox = (ListBox)sender

            Point point = new Point(e.X, e.Y);

            int hoverIndex = listBox.IndexFromPoint(point);

            if (hoverIndex >= 0 && hoverIndex < listBox.Items.Count)

            {

                tt.SetToolTip(listBox, listBox.Items[hoverIndex].ToString());

            }

        }

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/c2e80333-7996-45ef-8acf-5f0a085a21e1/

     

    2009年7月8日 13:46
  •  

    4.2如何将一个业务对象(business object)添加到ListBox的项集合中,并让它显示所需的数据?  [回到顶端]

      

    一般的做法是设置DisplayMember为业务对象(business object)的属性名。

      

    第二种方法是使用TypeConverter来转换业务对象(business object)。你需要创建自定义的TypeConverter并重写它的ConvertTo方法。请参考以下代码:

      

    代码:

    [TypeConverter(typeof(BusinessTypeConvert))]

    class BusinessObject

    {

        int id;

     

        public int Id

        {

            get { return id; }

            set { id = value; }

        }

     

        string name;

     

        public string Name

        {

            get { return name; }

            set { name = value; }

        }

    }

     

    class BusinessTypeConvert :TypeConverter

    {

        public override object ConvertTo(ITypeDescriptorContext context,

              System.Globalization.CultureInfo culture, object value, Type destinationType)

        {

            if (destinationType == typeof(string))

                return ((BusinessObject)value).Name;

            return base.ConvertTo(context, culture, value, destinationType);

        }

    }

      

    第三种方法是重写业务对象(business object)的ToString方法,在方法中返回所希望的文本。但是由于ToString方法一般用来返回一些有关类的信息,所以这种方法是不被推荐的。

     

    2009年7月8日 13:47
  •  

    4.3如何实现双重导向的ListBox?  [回到顶端]

      

    用户可能希望用两个按钮来移动ListBox中的项。比如点击‘左->右’按钮将左边ListBox中的项移动到右边的ListBox中,‘右->左’将右边ListBox中的项移动到左边的ListBox中。

      

    首先拖放两个ListBox,在中间拖放两个Button控件。两个按钮的文本分别为‘左->右’、 ‘右->左’。

    将以下代码添加到‘左->右’按钮的点击事件中:

      

    代码:

    foreach (int index in listBox1.SelectedIndices)

    {

        listBox2.Items.Add(listBox1.Items[index]);

        listBox1.Items.RemoveAt(index);

    }

     

    以下代码添加到‘右->左’按钮的点击事件中:

     

    foreach (int index in listBox2.SelectedIndices)

    {

        listBox1.Items.Add(listBox2.Items[index]);

        listBox2.Items.RemoveAt(index);

    }

      

    注意,两个ListBoxSelectionMode都要设置为MultiSimple

     

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/2448c853-8b0e-4fe0-a327-f905e2f41aab/

     

    2009年7月8日 13:47
  •  

    5.1MainMenuMenuStrip有什么联系?  [回到顶端]

      

    MenuStrip完全取代了MainMenu,他们之间没有共同点。旧版本的MainMenu的位置是在内置的Windows所支持菜单的上方。因此GetClientRect()函数返回将矩形的工作区域减去菜单的所占空间的区域。MenuStrip则不需要使用Windows菜单,因此GetClientRect()将忽略MenuStrip所占据的空间返回将是整个窗体的工作区域。这也同样适用于其他停靠在窗体边界的控件,比如StatusStripToolStrip或者像这种情况的其他停靠项。

     

    2009年7月8日 13:48
  •  

    5.2如何禁止MenuStripAlt键的功能?  [回到顶端]

     

    这就需要重写MenuStripProcessDialogKey方法,请参考以下代码:

     

    代码:

    public class MyMenuStrip : MenuStrip

    {

        protected override bool ProcessDialogKey(Keys keyData)

        {

            if ((keyData & Keys.Alt) == Keys.Alt)

                return true;

            else

                return base.ProcessDialogKey(keyData);

        }

    }

     

    2009年7月8日 13:48
  •  

    5.3如何设置MenuStripItem下拉框中所显示的项的个数?  [回到顶端]

     

    如果MenuStripItem的下拉列表中的项过多,则需很大的空间来显示所有这些项,那么如何限制下拉列表项的显示个数。我们可以把MenuStripItem.DropDownAutoSize属性设置为false,并设置它的下拉长度。

      

    代码:

    this.fileToolStripMenuItem.DropDown.AutoSize = false;

    int itemHeight = fileToolStripMenuItem.DropDownItems[0].Height;

    int itemsCount = 5;

    this.fileToolStripMenuItem.DropDown.Height = itemHeight * itemsCount;

     

    2009年7月8日 13:49
  •  

    6.1如何设置ToolStripToolStriptem的高度?  [回到顶端]

     

    ToolStripToolStripItemAutoSize属性设置为false,设置ToolStripToolStripItem的高度,注意ToolStrip的高度应该大于所有的ToolStripItem的高度。

      

    代码:

    this.toolStrip1.AutoSize = false;

    this.toolStripButton1.AutoSize = false;

    this.toolStripButton2.AutoSize = false;

    this.toolStripButton3.AutoSize = false;

    this.toolStripButton1.Height = 20;

    this.toolStripButton2.Height = 40;

    this.toolStripButton3.Height = 60;

    this.toolStrip1.Height = 65;

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/63c6d846-9afe-47d3-bfe7-7cb7cd5a3ecb/

     

    2009年7月8日 13:49
  •  

    6.2如何让ToolStripTextBox的输入显示为默认系统密码字符‘*’?  [回到顶端]

      

    ToolStripTextBox实际上包含一个TextBox来让用户输入。我们可以获取承载于ToolStripTextBox中的TextBox并设置其PasswordChar属性。

      

    代码:

    if (this.toolStripTextBox1.Control is TextBox)

    {

        TextBox tb = this.toolStripTextBox1.Control as TextBox;

        tb.PasswordChar = '*';

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/018e8f9c-ea8f-4580-a571-5a38a9185674/

     

    2009年7月8日 13:50
  •  

    6.3为什么ToolStripButton不触发验证?  [回到顶端]

      

    默认情况下,工具栏和菜单在点击时不需要获取焦点,所以它们不需要强制执行控件的验证。与此相关的问题是当点击toolstrip时为什么不提交数据到数据源。为了解决这个问题,我们可以Click事件中强制验证。

      

    代码:

    this.Validate();//this指当前窗体

     

    2009年7月8日 13:50
  •  

    7.1如何在TabPage页眉添加关闭按钮?  [回到顶端]

     

    我们可以通过自定义一个控件继承于TabControl,重写它的OnDrawItem方法来绘制“关闭按钮”,然后通过判断鼠标是否点击在“关闭按钮”上来关闭选项卡。有关详细信息,请参考下面链接中的文档。

     

    http://www.codeproject.com/cs/miscctrl/firefoxtabcontrol.asp

     

    2009年7月8日 13:50
  •  

    7.2如何隐藏TabPage的页眉?  [回到顶端]

     

    在项目中新建一个类并添加以下代码,编译项目,这样你就创建了一个自定义的TabControl。我们可以在工具箱(toolbox)的顶部拖拽刚创建的控件到窗体上。在设计时,该控件看起来和TabControl一样。但是在运行时,只能看到页面。我们可以通过SelectIndex属性来选择浏览的页面。

     

    代码:

    using System;

    using System.Windows.Forms;

     

    public class WizardPages : TabControl

    {

        protected override void WndProc(ref Message m)

        {

            // 通过捕获TCM_ADJUSTRECT信息来隐藏标签

            if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1;

            else

               base.WndProc(ref m);

        }

    }

      

    相关链接:

    http://social.msdn.microsoft.com/forums/en-US/winforms/thread/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/

     

    2009年7月8日 13:51