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()
方法。如果您使用JTextField
,setEditable()
将是完成相同事情的方法,而不是您使用的简单 AWT TextField
。您应该养成查看official documentation 的习惯,在那里很容易找到答案。
resultNum.setEnabled(false);
请注意,禁用的框将显示为灰色,这可能在视觉上没有吸引力。解决方案是转换为 Java Swing,这将允许您使用 setEditable
,这只会阻止您的用户在不更改外观的情况下单击框。 Swing 还允许您使用更加复杂和灵活的布局管理器。
【讨论】:
"..or 布局会将第三个框堆叠在第一个框之下。" 这是流式布局不是我布局的首选的原因之一标签/字段对。我倾向于使用网格 bag 布局,或者 OP 已经在使用的“穷人的等价物”,网格布局将使所有单元格的大小相同。group layout
可以产生与网格包布局相同的结果,但需要更多的努力。
@AndrewThompson 我听到了,但他坚持采用无 Swing 的方法。我有一段时间没有接触过 AWT,所以很可能有更好的布局适合问题的参数,但我故意排除了 Swing 解决方案。
OK 忘记组布局,但GridBagLayout
与GridLayout
和FlowLayout
一样是AWT 的一部分。以上是关于c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?的主要内容,如果未能解决你的问题,请参考以下文章