我有一個帶有文本框的表單,用於輸入URL。我需要在此文本框中添加(http://)作爲預定義的值,並且希望它只能被讀取,因此用戶將無法刪除http://但他可以在其後面寫入。如何將WinForms TextBox的前幾個字符設置爲只讀?
任何幫助將高度讚賞。
我有一個帶有文本框的表單,用於輸入URL。我需要在此文本框中添加(http://)作爲預定義的值,並且希望它只能被讀取,因此用戶將無法刪除http://但他可以在其後面寫入。如何將WinForms TextBox的前幾個字符設置爲只讀?
任何幫助將高度讚賞。
這裏有幾個選項:
簡單的方法是隻創建文本框(左側)外的label以這些字符。 (對用戶來說簡單易懂)
創建第二個只讀文本框以在開始時使用,設置它的樣式以匹配輸入文本並將它們對齊。是的,你會得到一個單一的像素線來分裂他們兩個,但我認爲這將增加用戶體驗,使其明顯不適合(我會親自選擇這個選項)
如果你需要你可以使用一個面板,標籤和文本框的樣式roll your own user control,根據需要設置合適的邊框樣式。 (最好的方式來獲得你需要的確切樣式)
第四種更煩人的方法是處理文本框本身的一個關鍵事件(如KeyDown)。有了這個,你可以做很多檢查,並改變插入位置以使其工作,但相信我這會做你的頭,試圖讓它完美的工作! (太多的辛勤工作得到右)
總之,我認爲選項2是這裏最好的。當然,如果你使用WPF,你無疑會在樣式上有更多的靈活性。
您是否考慮在其旁邊加上「http://」作爲文本?然後當接受用戶輸入時,你可以在你的textbox.Text中添加「http://」。
這裏是另一個想法:
在每個退格鍵按下,算在你的文本字符數。如果它是== 7,則忽略退格。如果更大,則檢查退格後的字符數。如果字符數小於7,則清除文本框並重置文本。
private void a_keyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)8)
{
if (myTextbox.Text.Length == 7)
// do stuff..
}
else if //do stuff...
}
您可以在textboxt中放置一個標籤,並將其文本屬性設置爲「http://」。或者你可以附加2個文本框一個是隻讀的另一個不是隻讀的。並在http://中寫入只讀。
你甚至可能甚至不能顯示http://並將其附加到Textbox.Text代碼。首先檢查它是否也以此爲開始。
爲了澄清我的最後一句話:
string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;
我假設他想要在文本框中顯示它,因此他爲什麼不想要標籤的想法。 – Doomsknight
我同意一個觀點,但是如果OP沒有進一步澄清他想要完成什麼以及爲什麼,我們能做的最好的是拋出一些建議。 我的觀點是維護http://的值是從Textbox.Text值中檢索的值。如果僅僅爲了審美目的而將http://保存在框中,則需要更多的努力。 – krillgar
什麼阻止他們,然後鍵入'http://'並導致附加到'http:// http:// blahblah'。附加前檢查的明顯解決方案。 +1雖然我不認爲這是其他人的建議,但一個有效的想法。他確實圍繞着只讀部分的想法。 ;) – Doomsknight
爲keyup
事件創建一個委託(可能還有其他人,例如剪貼板),並檢查該值的開始。
$('#myField').bind('keypress', function(event)
{
if (event.charCode == 0 && event.currentTarget.value.length <= 7)
{
return false;
}
});
這不會工作,如果。如果字符串長度超過7,他們仍然可以改變開始。 –
@SteveDog:其實,它不會工作,因爲winforms不支持javascript/jQuery – musefan
@musefan嗯,是的,這也是真的:)雖然,我不相信提問者曾經肯定地說它是一個WinForm應用程序。 –
是這樣的嗎?
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = sender as TextBox;
if (!textBox.Text.StartsWith("http://"))
{
textBox.Text = "http://";
textBox.Select(textBox.Text.Length, 0);
}
}
注:我誤解了問題,由於不知何故,我來到這裏,從「HTML」 - 標籤。但是如果你想用HTML/CSS做這樣的事情,這可能是一個解決方案。
你可以做這樣的事情:
<style>
label.mylabel, input.myinput {
display: block;
float: left;
height: 20px;
margin: 0;
padding: 10px 5px 0px 5px;
border: 1px solid #ccc;
font-size: 11px;
line-height: 11px;
}
label.mylabel {
border-right: 0;
}
input.myinput {
border-left: 0;
}
</style>
<label class="mylabel" for="myinput">http://</label>
<input id="myinput" class="myinput" name="myinput" value="">
所以這有兩個好處:
當然,你必須添加'h ttp://'在發送表單後手動。
整件事情有一個缺點。如果您的用戶想要插入 'https://',什麼是? :)
乾杯, 菲利普
...您的答案的另一個缺點... OP不使用HTML,這是一個WinForms項目 – musefan
哦,我剛剛意識到這一點。抱歉,是我的錯。我只是在概述中點擊「HTML」標籤,然後出現了這個標籤。沒有讀得不夠好。 :) – insertusernamehere
如果你想要一個CSS的方法(加上背景圖像),你可以嘗試something like this:
Enter URL: <input type="text" size="50" class="url" value="www.google.com" />
<style>
input[type="text"].url {
background: url(http://s18.postimage.org/4wkjdpidh/http.png) no-repeat left top transparent;
text-indent: 34px;
}
</style>
然後,它只是一個回到前面加上http://
的事輸入的值,當你去處理它。
看來這是winforms;方法仍然是有效的,但可能不適用於OP的問題。不過,我會把它留在這裏以供SEO參考。 –
你可以使用一個RichTextBox相反,它允許保護正文:
public Form1() {
InitializeComponent();
richTextBox1.Text = "http://";
richTextBox1.SelectAll();
richTextBox1.SelectionProtected = true;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.DetectUrls = false; // optional
}
但不幸的是,如果你設置了多行屬性爲False,它不能很好地工作。
使用TextBox實現它的實用方法是將其設置爲您想要的樣子。也適用於粘貼和選擇刪除:
string protect = "http://";
private void textBox1_TextChanged(object sender, EventArgs e) {
if (!textBox1.Text.StartsWith(protect)) {
textBox1.Text = protect;
textBox1.SelectionStart = textBox1.Text.Length;
}
}
不錯的想法與RTB,但這種風格會與其他文本框樣式衝突:( – musefan
最簡單的解決方案是簡單地將「http://」放在文本框之前的標籤中。 –
將另一個文本框放在它旁邊,並使其只能讀取,但將它們放在一起以便看起來像它的一個。然後加入代碼中的字符串? –
我知道,但由於某種原因,我想使用它像這樣! –