如何让Label标签出现垂直滚动条

dongyisheng 2013-11-03 10:12:35
这个问题已经困扰我很久了。百度谷歌了很多方法……
问题描述:因为程序需要从数据库中读取一些信息,用label呈现出来,之所以用Label不用Textbox,是为了防止用户复制数据,但是这些信息有多有少,所以Label的长度不能确定

百度如下的结果:
(1)如果用Label,要想让其出现滚动条,可以把Label放进Panel容器,让Panel的AutoScroll设为True,将Label的AutoSize设为false,但是问题是由于信息长度不确定,无法事先确定Label的长度。
(2)如果用TextBox,滚动条的问题和长度自动确定的问题都可以化解,但是无法做到像Label让用户无法选择的目的,比如将Enable设为False,文字太长,出现滚动条后,居然不能拖动!

请问大家有遇到这样的问题吗? 如何才能就解决的困境。
...全文
2613 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
微wx笑 2014-11-17
  • 打赏
  • 举报
回复
运行效果参考:C# 带滚动条的Label控件
微wx笑 2014-11-17
  • 打赏
  • 举报
回复
用鼠标选的时候还是有点闪烁,以下为c#版本:
namespace 带滚动条的Label控件
{
    public class TextBoxLabel : System.Windows.Forms.TextBox
    {
        [DllImport("user32", EntryPoint = "HideCaret")]
        private static extern bool HideCaret(IntPtr hWnd);

        [DllImport("user32", EntryPoint = "ShowCaret")]
        private static extern bool ShowCaret(IntPtr hWnd);

        public TextBoxLabel():base(){

            this.TabStop = false;
            this.SetStyle(ControlStyles.Selectable, false);
            this.Cursor = Cursors.Default;
            this.ReadOnly = true;
            this.ShortcutsEnabled = false;
            this.HideSelection = true;
            this.GotFocus += new EventHandler(TextBoxLabel_GotFocus);
            this.MouseMove += new MouseEventHandler(TextBoxLabel_MouseMove);
        }

        private void TextBoxLabel_GotFocus(Object sender, System.EventArgs e){
            if (ShowCaret(((TextBox)sender).Handle)){
                HideCaret(((TextBox)sender).Handle);
            }
        }

        private void TextBoxLabel_MouseMove(Object sender, MouseEventArgs e){
            if (((TextBox)sender).SelectedText.Length > 0){
                ((TextBox)sender).SelectionLength = 0;
            }
        }
    }
}
dongyisheng 2013-11-04
  • 打赏
  • 举报
回复
在大家的帮助下 我已经搞定了。现在我把解决法案和大家分享一下。 主要思想就是把Textbox重写一下 代码如下

[code=vb]
Public Class TextBoxEx
    Inherits System.Windows.Forms.TextBox
    Declare Function HideCaret Lib "user32" Alias "HideCaret" (ByVal hwnd As Integer) As Integer
    Declare Function ShowCaret Lib "user32" Alias "ShowCaret" (ByVal hwnd As Integer) As Integer
    Public Sub New()
        MyBase.New()
        MyBase.TabStop = False
        MyBase.SetStyle(ControlStyles.Selectable, False)
        MyBase.Cursor = Cursors.Default
        MyBase.ReadOnly = True
        MyBase.ShortcutsEnabled = False
        AddHandler MyBase.GotFocus, AddressOf TextBoxEx_GotFocus '绑定事件处理程序
        AddHandler MyBase.MouseMove, AddressOf TextBoxEx_MouseMove '绑定事件处理程序
    End Sub
    Private Sub TextBoxEx_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        If ShowCaret(CType(sender, TextBox).Handle) Then
            HideCaret(CType(sender, TextBox).Handle)
        End If
    End Sub
    Private Sub TextBoxEx_MouseMove(ByVal sender As Object, ByVal e As System.EventArgs)
        If CType(sender, TextBox).SelectedText.Length > 0 Then
            CType(sender, TextBox).SelectionLength = 0
        End If
    End Sub
End Class
[/code]
dongyisheng 2013-11-04
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648403(v=vs.85).aspx 在SelectionChanged事件中 e.Handled = true textBox1.SelectionLength = 0;
貌似在textbox里面没有SelectionChanged事件的吧?
xxxuan 2013-11-04
  • 打赏
  • 举报
回复
你把textbox设置enabled设置成false就可以了
threenewbee 2013-11-03
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648403(v=vs.85).aspx 在SelectionChanged事件中 e.Handled = true textBox1.SelectionLength = 0;
dongyisheng 2013-11-03
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
使用TextBox就可以。 配合几个API就可以隐藏选中和插入点光标。
使用哪个API,求大神赐教!!!!!
dongyisheng 2013-11-03
  • 打赏
  • 举报
回复
我重写了 Textbox Public Sub New() MyBase.New() MyBase.ShortcutsEnabled = False MyBase.SetStyle(ControlStyles.Selectable, False) MyBase.Cursor = Cursors.Default MyBase.Enabled = False End Sub
threenewbee 2013-11-03
  • 打赏
  • 举报
回复
使用TextBox就可以。 配合几个API就可以隐藏选中和插入点光标。
dongyisheng 2013-11-03
  • 打赏
  • 举报
回复
引用 4 楼 wind_cloud2011 的回复:
http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.shortcutsenabled
现在用临时的办法,就是用ShortcutsEnabled设为False 有没有Textbox在Enable为False条件下 可以让滚动条继续可用的代码?
wind_cloud2011 2013-11-03
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.shortcutsenabled
wind_cloud2011 2013-11-03
  • 打赏
  • 举报
回复
如果用TextBox,再以禁止复制之类,
dongyisheng 2013-11-03
  • 打赏
  • 举报
回复
引用 1 楼 wind_cloud2011 的回复:
你可以取得信息的的长度做为lable的长度阿,再动态加载lable控件
这个我也想到了,主要是因为字体的大小会可能会睡着用户的设置而不一样,还有就是Label的宽度可能会随着用户把窗体最大化而变化,所以,在上述两个条件下的设定下,如何根据信息的长度来确定Label的长度呢?貌似每个汉字的宽度是不一样的,如果不是等宽字体的话。
wind_cloud2011 2013-11-03
  • 打赏
  • 举报
回复
你可以取得信息的的长度做为lable的长度阿,再动态加载lable控件

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧