2012-06-14 57 views
48

我有一個帶有文本框的表單,用於輸入URL。我需要在此文本框中添加(http://)作爲預定義的值,並且希望它只能被讀取,因此用戶將無法刪除http://但他可以在其後面寫入。如何將WinForms TextBox的前幾個字符設置爲只讀?

enter image description here

任何幫助將高度讚賞。

+48

最簡單的解決方案是簡單地將「http://」放在文本框之前的標籤中。 –

+0

將另一個文本框放在它旁邊,並使其只能讀取,但將它們放在一起以便看起來像它的一個。然後加入代碼中的字符串? –

+0

我知道,但由於某種原因,我想使用它像這樣! –

回答

60

這裏有幾個選項:

  1. 簡單的方法是隻創建文本框(左側)外的label以這些字符。 (對用戶來說簡單易懂)

  2. 創建第二個只讀文本框以在開始時使用,設置它的樣式以匹配輸入文本並將它們對齊。是的,你會得到一個單一的像素線來分裂他們兩個,但我認爲這將增加用戶體驗,使其明顯不適合(我會親自選擇這個選項)

  3. 如果你需要你可以使用一個面板,標籤和文本框的樣式roll your own user control,根據需要設置合適的邊框樣式。 (最好的方式來獲得你需要的確切樣式)

  4. 第四種更煩人的方法是處理文本框本身的一個關鍵事件(如KeyDown)。有了這個,你可以做很多檢查,並改變插入位置以使其工作,但相信我這會做你的頭,試圖讓它完美的工作! (太多的辛勤工作得到右)

總之,我認爲選項2是這裏最好的。當然,如果你使用WPF,你無疑會在樣式上有更多的靈活性。

+1

+1特別是對於選項2 – dj18

+48

選項5:隱藏地添加'http://',如果它缺少,就像瀏覽器一樣。所以當我輸入'stackoverflow.com'並且文本框失去焦點時,將其更改爲'http:// stackoverflow.com'。如果它已經以'http://開頭'離開它,甚至接受的不僅僅是'http'作爲協議。 – poke

+10

不要忘了給'https://一些愛......雖然今天很少見,'ftp:'仍然有它的地位。 – RBerteig

20

您是否考慮在其旁邊加上「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... 
} 
+3

backspace選項是一些不錯的選擇,但不要忘記粘貼並選擇所有問題。 – musefan

+0

好吧,如果文本大於7,您可以檢查文本是否以http:\\開頭,如果是,則保留它,如果不是,則添加它。我認爲這涵蓋了每一種可能性。 – Eric

+0

現在不能想出任何與之爭論的東西;) – musefan

1

您可以在textboxt中放置一個標籤,並將其文本屬性設置爲「http://」。或者你可以附加2個文本框一個是隻讀的另一個不是隻讀的。並在http://中寫入只讀。

12

你甚至可能甚至不能顯示http://並將其附加到Textbox.Text代碼。首先檢查它是否也以此爲開始。

爲了澄清我的最後一句話:

string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text; 
+0

我假設他想要在文本框中顯示它,因此他爲什麼不想要標籤的想法。 – Doomsknight

+0

我同意一個觀點,但是如果OP沒有進一步澄清他想要完成什麼以及爲什麼,我們能做的最好的是拋出一些建議。 我的觀點是維護http://的值是從Textbox.Text值中檢索的值。如果僅僅爲了審美目的而將http://保存在框中,則需要更多的努力。 – krillgar

+0

什麼阻止他們,然後鍵入'http://'並導致附加到'http:// http:// blahblah'。附加前檢查的明顯解決方案。 +1雖然我不認爲這是其他人的建議,但一個有效的想法。他確實圍繞着只讀部分的想法。 ;) – Doomsknight

0

keyup事件創建一個委託(可能還有其他人,例如剪貼板),並檢查該值的開始。

0
$('#myField').bind('keypress', function(event) 
{ 
    if (event.charCode == 0 && event.currentTarget.value.length <= 7) 
{ 
    return false; 
} 
}); 
+1

這不會工作,如果。如果字符串長度超過7,他們仍然可以改變開始。 –

+1

@SteveDog:其實,它不會工作,因爲winforms不支持javascript/jQuery – musefan

+0

@musefan嗯,是的,這也是真的:)雖然,我不相信提問者曾經肯定地說它是一個WinForm應用程序。 –

6

是這樣的嗎?

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); 

    } 
} 
+0

這與他正在尋找的內容更接近,但如果他們鍵入整個URL,然後返回並更改一開始,它會全部消失。 –

+0

儘管文本仍然可刪除。 – Eric

+1

10%面向黑客...嘗試使用KeyDown將其撞到25%完成;) – musefan

4

注:我誤解了問題,由於不知何故,我來到這裏,從「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=""> 

所以這有兩個好處:

  • 它看起來像一個輸入框
  • 當用戶點擊 「HTTP」,實際表格領域將集中

當然,你必須添加'h ttp://'在發送表單後手動。

整件事情有一個缺點。如果您的用戶想要插入 'https://',什麼是? :)

乾杯, 菲利普

+0

...您的答案的另一個缺點... OP不使用HTML,這是一個WinForms項目 – musefan

+0

哦,我剛剛意識到這一點。抱歉,是我的錯。我只是在概述中點擊「HTML」標籤,然後出現了這個標籤。沒有讀得不夠好。 :) – insertusernamehere

4

如果你想要一個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://的事輸入的值,當你去處理它。

+0

看來這是winforms;方法仍然是有效的,但可能不適用於OP的問題。不過,我會把它留在這裏以供SEO參考。 –

5

你可以使用一個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; 
     } 
    } 
+2

不錯的想法與RTB,但這種風格會與其他文本框樣式衝突:( – musefan

相關問題