c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?相关的知识,希望对你有一定的参考价值。

c#TextBox
里控件有一个属性叫ReadOnly,把它改为True,就可以实现只读的效果
参考技术A 文本框?
Enabled = false就可以了啊
参考技术B Visual Basic中的文本框控件允许用户在其中键入文本,以便在程序中使用。相反,程序员可能会希望显示一些文本但不希望用户编辑该文本。本文介绍了如何创建只读的文本框控件的内容。

使一个文本框控件只读

在Visual Basic中,如果文本框控件的MultiLine属性设置为True,文本将会自动地换行到下一行。另外,如果文本框控件的ScrollBars属性设置为3-Both(或者1-Vertical,或者2-Horizontal),用户还能够滚动控件中的内容。

程序员要想实现文本框控件中的文本不可编辑,可将文本框控件中的内容设置为只读状态,这可以通过使用Microsoft Windows应用程序编程接口(API)的SendMessage函数来实现。

SendMessage函数可以用来发送一个EM_SETREADONLY消息到文本框控件中,这将使文本框控件变为只读。

要在程序中使用该SendMessage函数,需要将如下的声明语句包含在项目的通用声明部分中(注意该声明语句需要书写在一行内):

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"(By Val hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVallParam As Long) As Long

该SendMessage函数需要4个参数,如下所示:

·hwnd 一个长整数值,它包含文本框控件的句柄。

.wMsg 一个长整数值,它包含被发送的消息,在这个例子里,是EM_SETREADONLY。

·wParam 一个整数值,如果它为True,则控件被设置只读标记,如果它为False,则删除控件的只读标记。

·lParam 一个长整数值,它应该被设置为0(EM_SETREADONLY不使用它)。

在程序运行了此SendMessage函数之后,将返回一个长整数值,指明调用成功(返回值非 0)或是失败(返回值为0)。

样例程序

该程序显示了如何防止用户编辑一个文本框控件中的内容。

1.在Visual Basic中开始一个新的工程,采用缺省的方法建立Form1。

2.将如下的常量和声明语句添加到Form1的通用声明部分中(注意该声明语句需

要书写在一行内):

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (B yVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long

Const WM_USER = &H400

Const EM_SETREADONLY = (WM_USER + 31)

3.在Form1上添加一个文本框控件,采用缺省的方法建立Text1。将其MultiLine属性

设置为True,并且将它的ScrollBars属性设置为3-Both。

4.在Form1上添加一个命令按钮控件,采用缺省的方法建立Command1。

5.将如下的代码添加到Command1的单击事件中:

Private Sub Command1_Click()

Dim RetVal As Long

RetVal = SendMessage(Text1.hwnd, EM_SETREADONLY, True, ByVal 0&)

End Sub

通过按下F5键来执行样例程序。在文本框控件中键入一些文本,可以使用水平和垂直流动条来滚动文本,还可以改变文本的内容。单击命令按钮,用户仍然可以使用流动条或是光标键来查看文本框控件的内容,但是不能编辑它。

如何使文本字段水平且不可编辑?

【中文标题】如何使文本字段水平且不可编辑?【英文标题】:How do I make a text fields horizontal and non-editable? 【发布时间】:2021-07-29 07:31:18 【问题描述】:

我有一个小程序,可以将两个数字相加并在第三个文本框中显示它们的总和。

https://pastebin.com/4ga1brD1

我希望文本框水平排列,但更重要的是我需要第三个文本框不可编辑。

import java.applet.*;

import java.awt.*;
import java.awt.event.*;
public class Question extends Applet implements ActionListener

   TextField firstNum, secondNum, resultNum;
   public Question()
                         
      setLayout(new GridLayout(3, 2, 10, 15));  
      setBackground(Color.cyan);
 
      firstNum = new TextField(15);
      secondNum = new TextField(15);
      resultNum = new TextField(15);
 
      secondNum.addActionListener(this);
 
      add(new Label("Enter First Number"));  
      add(firstNum);
      add(new Label("Enter Second Number")); 
      add(secondNum);
      add(new Label("S U M"));               
      add(resultNum);
   
   public void actionPerformed(ActionEvent e)
                           
      String str1 = firstNum.getText();
      double fn = Double.parseDouble(str1);
      double sn = Double.parseDouble(secondNum.getText());
 
      resultNum.setText("Sum is " + (fn+sn));
   

【问题讨论】:

在继续之前,我只想确保您了解您没有使用 Swing,并且小程序已过时。你确定这是你想要追求的策略吗?这种方法将使您至少落后 15 年。 @MarsAtomic 是的。 我需要第三个文本框不可编辑。 - 人们不再编写小程序或使用 AWT。因此,如果您想继续沿着这条道路前进,您将需要自己解决问题。其中一部分是阅读 API 以找到要使用的适当方法。 “是的。” 嗯。 为什么? 即使回到我仍然为小程序提供支持的时候,如果是布局/组件问题,我建议先将其分类到 Panel(或JPanel) 显示在 Frame(或 JFrame)中。原因是启动和调试框架更简单。修复后,面板可以直接放入小程序中。现在处于大多数人甚至无法运行小程序的阶段,因此我们提供帮助的机会受到了阻碍。至于AWT,它是很久以前被取代的,以至于我们大多数有经验的人都忘记了大部分细节! BTW - this 是网格布局的外观,这种布局比将所有标签/字段组合放在一行中要好。为什么用户想要那个“一行”?提供整个 GUI 的预期布局的 ASCII 艺术或简单绘图。 【参考方案1】:

要水平排列TextField 组件,请不要将它们直接添加到Applet。相反,创建一个Panel,给它一个FlowLayout,然后将你的TextField 组件添加到Panel。然后您可以将Panel 直接添加到您的Applet。确保您的 Applet 足够宽,可以并排放置所有三个盒子,否则布局会将第三个盒子堆叠在第一个盒子下面。

注意:我会为你测试这个,但至少五年来没有浏览器支持 Applet。

要使第三个TextField 不可编辑,您需要使用setEnabled() 方法。如果您使用JTextFieldsetEditable() 将是完成相同事情的方法,而不是您使用的简单 AWT TextField。您应该养成查看official documentation 的习惯,在那里很容易找到答案。

resultNum.setEnabled(false);

请注意,禁用的框将显示为灰色,这可能在视觉上没有吸引力。解决方案是转换为 Java Swing,这将允许您使用 setEditable,这只会阻止您的用户在不更改外观的情况下单击框。 Swing 还允许您使用更加复杂和灵活的布局管理器。

【讨论】:

"..or 布局会将第三个框堆叠在第一个框之下。" 这是流式布局不是我布局的首选的原因之一标签/字段对。我倾向于使用网格 bag 布局,或者 OP 已经在使用的“穷人的等价物”,网格布局将使所有单元格的大小相同。 group layout 可以产生与网格包布局相同的结果,但需要更多的努力。 @AndrewThompson 我听到了,但他坚持采用无 Swing 的方法。我有一段时间没有接触过 AWT,所以很可能有更好的布局适合问题的参数,但我故意排除了 Swing 解决方案。 OK 忘记组布局,但GridBagLayoutGridLayoutFlowLayout 一样是AWT 的一部分。

以上是关于c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?的主要内容,如果未能解决你的问题,请参考以下文章

使input文本框不可编辑的3种方法

如何使文本字段水平且不可编辑?

使input文本框不可编辑的3种方法

C# TextBox调整行间距

C# TextBox调整行间距

如何在C#中,文本框不能粘贴功能