2009-06-26 34 views
13

मैं multiline विकल्प ON के साथ Winforms टेक्स्टबॉक्स का उपयोग कर रहा हूं। मैं उस लाइन की संख्या को सीमित करना चाहता हूं जिसमें इसे दर्ज किया जा सकता है। उपयोगकर्ता उस से अधिक लाइनों में प्रवेश करने में सक्षम नहीं होना चाहिए।.net टेक्स्टबॉक्स में लाइनों की सीमा संख्या

मैं इसे कैसे प्राप्त कर सकता हूं?

+0

+1 अच्छा प्रश्न –

+0

रमेश, मैं अपने जवाब देने के लिए एक नया समाधान जो अधिक लाइनों को जोड़ने जब अधिकतम लाइनों को पार कर रहे हैं से उन रोका जा सके जोड़ लिया है। मौजूदा टेक्स्ट बॉक्स मान को संपादित या छोटा करने की आवश्यकता नहीं है। आपको जिस चीज का उपयोग करने की ज़रूरत है वह वह है। –

+0

@ रश्मी, लेकिन यह बहुत सारे परिदृश्य को संभाल नहीं करता है। कॉपी पेस्ट की तरह, टेक्स्ट रैपिंग आदि .. –

उत्तर

13

आप

txtbox.Lines.Length

के लिए जांच करने की आवश्यकता आप 2 परिदृश्यों के लिए इस संभाल करने की जरूरत है: 1. उपयोगकर्ता पाठ बॉक्स 2. उपयोगकर्ता पाठ बॉक्स

उपयोगकर्ता में पाठ चिपकाया गया है में लिख रहा है टेक्स्टबॉक्स

आपको टेक्स्ट बॉक्स की कुंजी प्रेस घटना को संभालने की आवश्यकता है ताकि अधिकतम लाइनों को पार होने पर उपयोगकर्ता को अधिक लाइनों में प्रवेश करने से रोका जा सके।

private const int MAX_LINES = 10; 

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (this.textBox1.Lines.Length >= MAX_LINES && e.KeyChar == '\r') 
    { 
     e.Handled = true; 
    } 
} 

मैंने उपरोक्त कोड का परीक्षण किया है। यह वांछित के रूप में काम करता है।

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (this.textBox1.Lines.Length > MAX_LINES) 
    { 
     this.textBox1.Undo(); 
     this.textBox1.ClearUndo(); 
     MessageBox.Show("Only " + MAX_LINES + " lines are allowed."); 
    } 
} 
+2

जटिल समस्याओं को हल करने के लिए प्रशिक्षित एक दिमाग अक्सर सादगी से पहले फंस जाता है! – Hemant

+0

उपयोगकर्ता –

+0

से अधिक लाइनों में प्रवेश करने में सक्षम नहीं होना चाहिए ... आपके पास ऐसा करने का वैध कारण हो सकता है। कृपया मेरा जवाब देखें। – Hemant

-2

ठीक:

उपयोगकर्ता चिपकाता पाठ बॉक्स

अधिकतम लाइनों की तुलना में अधिक चिपकाने से उपयोगकर्ता को रोकने के लिए कुछ टेक्स्ट, आप पाठ बदल ईवेंट हैंडलर कोड कर सकते हैं। कैसे एक उदाहरण चर "lastKnownGoodText" को परिभाषित करने और कुछ इस तरह करने के बारे में:

private void textBox_TextChanged (object sender, EventArgs e) { 
    if (textBox.Lines.Length > 10) 
     textBox.Text = lastKnownGoodText; 
    else 
     lastKnownGoodText = textBox.Text; 
} 
+1

यह एक अच्छा दृष्टिकोण है। हालांकि मैं lastKnownGoodText के बारे में निश्चित नहीं हूं। यदि उपयोगकर्ता टेक्स्ट में प्रवेश करने के लिए कॉपी-पेस्ट करता है तो यह काफी अलग हो सकता है और वह अपना नया प्रतिलिपि बना सकता है। बदले में क्यों नहीं छेड़छाड़? –

+0

हाँ आप सही हैं। इसे अंतिम ज्ञात अच्छे संस्करण में बहाल करने के बजाए छोटा किया जाना चाहिए। – Hemant

+0

मैंने अपनी प्रतिक्रिया संपादित की है जिसे अब छंटनी की आवश्यकता नहीं है। –

0

आप क्या हासिल करने की कोशिश कर रहे हैं पर निर्भर करता है, वहाँ भी है MaxLength संपत्ति वर्णों की संख्या आप पाठ बॉक्स में दर्ज कर सकते हैं स्थापित करने के लिए (चूंकि एक पंक्ति में एक चर लंबाई हो सकती है)।

+3

मैक्सलेथेंथ लाइनों की संख्या को सीमित करने में मदद नहीं करता है। –

0

कॉपी/पेस्ट के लिए छंटनी के साथ अधिकतम MAX_LINES तक सीमित करें।

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (textBox1.Lines.Length >= MAX_LINES && e.KeyValue == '\r') 
      e.Handled = true; 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (textBox1.Lines.Length > MAX_LINES) 
     { 
      string[] temp = new string[MAX_LINES]; 
      for (int i = 0; i < MAX_LINES; i++) 
      { 
       temp[i] = textBox1.Lines[i]; 
      } 

      textBox1.Lines = temp; 
     } 
    } 
1

यह समाधान क्योंकि जब आप लगातार लिखते हैं, तो 1 लाइन लाइनों आप स्क्रीन पर देखते का कोई ध्यान दिए बिना माना जाएगा काम नहीं करता।

इसे हल करने के लिए, आपको स्क्रीन पर दिखाई देने वाली रेखाओं की संख्या को गिनने के लिए SendMessage API का उपयोग करने की आवश्यकता है। कोड यहाँ है।

Private Declare Function SendMessageINT Lib "user32" Alias "SendMessageA" _ 
     (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer 
Private Const EM_GETLINECOUNT = &HBA 

Private Sub txtText1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtText1.KeyPress 

    Const MAX_LINES = 13 
    Dim lngCount As Long 

    lngCount = SendMessageINT(txtText1.Handle, EM_GETLINECOUNT, 0, 0) 

    If lngCount = MAX_LINES And Asc(e.KeyChar) <> Keys.Back And Asc(e.KeyChar) <> Keys.Delete Then 
     e.Handled = True 
    End If 
End Sub 

इसके साथ ही, आप पाठ बॉक्स में कर्सर की स्थिति पता लगाने के लिए, ताकि आप उपयोगकर्ता टाइप करने के लिए अनुमति दे सकते हैं की जरूरत है। पिछले कोड में, एक बार यह 13 लाइनों तक पहुंचने के बाद, उपयोगकर्ता किसी भी पंक्ति में टाइप नहीं कर पाएगा। उस पर काबू पाने के लिए, आपको पता लगाना होगा कि कर्सर किस रेखा में है। इसके लिए नीचे दिए गए कोड का प्रयोग करें।

एपीआई घोषणा

निजी कॉन्स्ट EM_LINEFROMCHAR = & HC9

कोड नीचे पाठ बॉक्स के MouseDown, MouseUp, KeyDown और KeyUp घटनाओं में रखा जाना चाहिए के साथ इस घोषणा करते हैं।

intLineNo = SendMessageINT (txtText1।हैंडल, EM_LINEFROMCHAR, -1,) + 1

लाइननो खोजने के बाद, आप टेक्स्टबॉक्स की कीप्रेस ईवेंट में मूल्यांकन कर सकते हैं।

0
private void txttrccertificateto_TextChanged(object sender, EventArgs e) 
{ 
    if (txttrccertificateto.Text.Length > MAX_Char) 
    { 
    txttrccertificateto.Text = txttrccertificateto.Text.Remove(MAX_Char, 1); 
    } 
    if (txttrccertificateto.Lines.Length > MAX_LINES) 
    { 
    string[] temp = new string[MAX_LINES]; 
    for (int i = 0; i < MAX_LINES; i++) 
    { 
     temp[i] = txttrccertificateto.Lines[i]; 
    } 

    txttrccertificateto.Lines = temp; 
    } 
} 

private void txttrccertificateto_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (txttrccertificateto.Lines.Length >= MAX_LINES && e.KeyValue == '\r') 
    e.Handled = true; 
    if (txttrccertificateto.Text.Length >= MAX_Char && e.KeyValue == '\r') 
    e.Handled = true; 
} 

private void txttrccertificateto_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (txttrccertificateto.Lines.Length >= MAX_LINES && e.KeyValue == '\r') 
    e.Handled = true; 
    if (txttrccertificateto.Text.Length >= MAX_Char && e.KeyValue == '\r') 
    e.Handled = true; 
} 
+0

हाय @ सैंटोश, और स्टैक ओवरफ्लो में आपका स्वागत है। यह अच्छा होगा अगर आप समझें कि कोड क्या करता है और क्यों। – SWeko

0

मुझे पता है कि यह एक पुराना धागा है, लेकिन यह मेरा समाधान है। आप मूल रूप से जांचते हैं कि क्लाइंट क्षेत्र से पहला या अंतिम अक्षर बाहर है या नहीं। किसी कारण से, यदि पहला अक्षर बॉक्स से बाहर स्क्रॉल हो जाता है, तो इसका वाई मान 0 से अधिक होगा, इसलिए मैं इसे भी देखता हूं। यह लाइन ब्रेक, कॉपी/पेस्ट और कैरेक्टर रैपिंग दोनों के लिए काम करता है।

Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Me.TextChanged 
    If Not Me.Multiline OrElse String.IsNullOrEmpty(Me.Text) OrElse _InTextChanged Then Exit Sub 
    _InTextChanged = True 

    Try 
     Dim posLast As Point = Me.GetPositionFromCharIndex(Me.Text.Length - 1) 
     Dim posFirst As Point = Me.GetPositionFromCharIndex(0) 

     Dim sizeLast As SizeF 
     Dim sizeFirst As SizeF 

     Using g As Graphics = Graphics.FromHwnd(Me.Handle) 
      sizeLast = g.MeasureString(Me.Text(Me.Text.Length - 1).ToString(), Me.Font) 
      sizeFirst = g.MeasureString(Me.Text(0).ToString(), Me.Font) 
     End Using 

     If posLast.Y + sizeLast.Height > Me.ClientSize.Height OrElse posFirst.Y < 0 OrElse posFirst.Y + sizeFirst.Height > Me.ClientSize.Height Then 

      Me.Text = _PreviousText 

      If _PreviousSelectionStart > Me.Text.Length Then 
       Me.SelectionStart = Me.Text.Length 
      Else 
       Me.SelectionStart = _PreviousSelectionStart 
      End If 


     End If 
    Catch ex As Exception 

    End Try 

    _InTextChanged = False 


    End Sub 

    Private Sub Textbox_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 
    _PreviousSelectionStart = Me.SelectionStart 
    _PreviousText = Me.Text 
    End Sub 
संबंधित मुद्दे