दिलचस्प पोस्ट
जावास्क्रिप्ट: क्लोन ए फ़ंक्शन पृष्ठ छोड़ने से पहले जावास्क्रिप्ट कर्ल स्थान त्रुटि का पालन करें इंस्टॉल किए गए एंड्रॉइड एप्लिकेशन की सूची कैसे प्राप्त करें और चलाने के लिए एक को चुनें कैसे निश्चित रूप से निर्धारित चौड़ाई फ़ाइलों को पार्स करने के लिए? क्या मैं HTML5 के उपयोग से <<inside> एक <बटन> तत्व घोंसला कर सकता हूं? यादृच्छिक "तत्व अब DOM से जुड़ा नहीं है" StaleElementReferenceException फ़ंक्शन से अनन्य आईपीटीआर रिटर्निंग उद्देश्य-सी पर बड़ा अंतर अब हमें एक व्यक्तिगत पोस्ट कैसे प्राप्त करनी चाहिए कि / v2.4 में पदावनत है? JMF का उपयोग करते हुए वीडियो कैप्चर कैसे करें, लेकिन जेएमएफ को स्थापित किए बिना जावास्क्रिप्ट के साथ दस्तावेज़ ऑब्जेक्ट कैसे बनाएँ क्या मैं एएसपी.नेट के साथ एचटीएमएल / ईमेल टेम्पलेट सेट कर सकता हूँ? एचटीएमएल फार्म जमा करते समय जेएसपी से सर्विसलेट को स्थानांतरित करने के लिए कैसे करें लिमिट 10..20 SQL सर्वर में

WinForms | सी # | एक टेक्स्टबॉक्स के मध्य में स्वतः पूर्ण?

मेरे पास एक टेक्स्ट बॉक्स है जो स्वत: पूर्णता को पसंद करता है:

txtName.AutoCompleteMode = AutoCompleteMode.Suggest; txtName.AutoCompleteSource = AutoCompleteSource.CustomSource; txtName.AutoCompleteCustomSource = namesCollection; 

यह काम करता है, लेकिन केवल एक टेक्स्टबॉक्स की शुरुआत में मैं किसी भी शब्द के लिए उपयोगकर्ता को प्रवेश करने के लिए स्वत: पूर्ण करना चाहता हूं, पाठ बॉक्स में किसी भी स्थान पर।

वेब के समाधान से एकत्रित समाधान "WinForms | सी # | एक टेक्स्टबॉक्स के मध्य में स्वतः पूर्ण?"

 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace TubeUploader { public class AutoCompleteTextBox : TextBox { private ListBox _listBox; private bool _isAdded; private String[] _values; private String _formerValue = String.Empty; public AutoCompleteTextBox() { InitializeComponent(); ResetListBox(); } private void InitializeComponent() { _listBox = new ListBox(); KeyDown += this_KeyDown; KeyUp += this_KeyUp; } private void ShowListBox() { if (!_isAdded) { Parent.Controls.Add(_listBox); _listBox.Left = Left; _listBox.Top = Top + Height; _isAdded = true; } _listBox.Visible = true; _listBox.BringToFront(); } private void ResetListBox() { _listBox.Visible = false; } private void this_KeyUp(object sender, KeyEventArgs e) { UpdateListBox(); } private void this_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Tab: { if (_listBox.Visible) { InsertWord((String)_listBox.SelectedItem); ResetListBox(); _formerValue = Text; } break; } case Keys.Down: { if ((_listBox.Visible) && (_listBox.SelectedIndex < _listBox.Items.Count - 1)) _listBox.SelectedIndex++; break; } case Keys.Up: { if ((_listBox.Visible) && (_listBox.SelectedIndex > 0)) _listBox.SelectedIndex--; break; } } } protected override bool IsInputKey(Keys keyData) { switch (keyData) { case Keys.Tab: return true; default: return base.IsInputKey(keyData); } } private void UpdateListBox() { if (Text == _formerValue) return; _formerValue = Text; String word = GetWord(); if (_values != null && word.Length > 0) { String[] matches = Array.FindAll(_values, x => (x.StartsWith(word, StringComparison.OrdinalIgnoreCase) && !SelectedValues.Contains(x))); if (matches.Length > 0) { ShowListBox(); _listBox.Items.Clear(); Array.ForEach(matches, x => _listBox.Items.Add(x)); _listBox.SelectedIndex = 0; _listBox.Height = 0; _listBox.Width = 0; Focus(); using (Graphics graphics = _listBox.CreateGraphics()) { for (int i = 0; i < _listBox.Items.Count; i++) { _listBox.Height += _listBox.GetItemHeight(i); // it item width is larger than the current one // set it to the new max item width // GetItemRectangle does not work for me // we add a little extra space by using '_' int itemWidth = (int)graphics.MeasureString(((String)_listBox.Items[i]) + "_", _listBox.Font).Width; _listBox.Width = (_listBox.Width < itemWidth) ? itemWidth : _listBox.Width; } } } else { ResetListBox(); } } else { ResetListBox(); } } private String GetWord() { String text = Text; int pos = SelectionStart; int posStart = text.LastIndexOf(' ', (pos < 1) ? 0 : pos - 1); posStart = (posStart == -1) ? 0 : posStart + 1; int posEnd = text.IndexOf(' ', pos); posEnd = (posEnd == -1) ? text.Length : posEnd; int length = ((posEnd - posStart) < 0) ? 0 : posEnd - posStart; return text.Substring(posStart, length); } private void InsertWord(String newTag) { String text = Text; int pos = SelectionStart; int posStart = text.LastIndexOf(' ', (pos < 1) ? 0 : pos - 1); posStart = (posStart == -1) ? 0 : posStart + 1; int posEnd = text.IndexOf(' ', pos); String firstPart = text.Substring(0, posStart) + newTag; String updatedText = firstPart + ((posEnd == -1) ? "" : text.Substring(posEnd, text.Length - posEnd)); Text = updatedText; SelectionStart = firstPart.Length; } public String[] Values { get { return _values; } set { _values = value; } } public List<String> SelectedValues { get { String[] result = Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); return new List<String>(result); } } } } 

नमूना उपयोग

 using System; using System.Windows.Forms; namespace AutoComplete { public partial class TestForm : Form { private readonly String[] _values = { "one", "two", "three", "tree", "four", "fivee" }; public TestForm() { InitializeComponent(); // AutoComplete is our special textbox control on the form AutoComplete.Values = _values; } } } 

मैंने प्राइमराएल आरएजे द्वारा प्रस्तावित समाधान में कुछ बदलाव किए क्योंकि सूची बॉक्स तब प्रदर्शित नहीं किया जा रहा था जब पाठ बॉक्स यूज़रट्रॉंट के अंदर था जो कि काफी लंबा नहीं था। असल में, टेक्स्ट बॉक्स के माता-पिता को सूची बॉक्स को जोड़ने के बजाय, मैं फ़ॉर्म में जोड़ा और मैं फॉर्म में पूर्ण स्थिति की गणना करता हूं।

 public class AutoCompleteTextBox : TextBox { private ListBox _listBox; private bool _isAdded; private String[] _values; private String _formerValue = String.Empty; public AutoCompleteTextBox() { InitializeComponent(); ResetListBox(); } private void InitializeComponent() { _listBox = new ListBox(); this.KeyDown += this_KeyDown; this.KeyUp += this_KeyUp; } private void ShowListBox() { if (!_isAdded) { Form parentForm = this.FindForm(); // new line added parentForm.Controls.Add(_listBox); // adds it to the form Point positionOnForm = parentForm.PointToClient(this.Parent.PointToScreen(this.Location)); // absolute position in the form _listBox.Left = positionOnForm.X; _listBox.Top = positionOnForm.Y + Height; _isAdded = true; } _listBox.Visible = true; _listBox.BringToFront(); } private void ResetListBox() { _listBox.Visible = false; } private void this_KeyUp(object sender, KeyEventArgs e) { UpdateListBox(); } private void this_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Enter: case Keys.Tab: { if (_listBox.Visible) { Text = _listBox.SelectedItem.ToString(); ResetListBox(); _formerValue = Text; this.Select(this.Text.Length, 0); e.Handled = true; } break; } case Keys.Down: { if ((_listBox.Visible) && (_listBox.SelectedIndex < _listBox.Items.Count - 1)) _listBox.SelectedIndex++; e.Handled = true; break; } case Keys.Up: { if ((_listBox.Visible) && (_listBox.SelectedIndex > 0)) _listBox.SelectedIndex--; e.Handled = true; break; } } } protected override bool IsInputKey(Keys keyData) { switch (keyData) { case Keys.Tab: if (_listBox.Visible) return true; else return false; default: return base.IsInputKey(keyData); } } private void UpdateListBox() { if (Text == _formerValue) return; _formerValue = this.Text; string word = this.Text; if (_values != null && word.Length > 0) { string[] matches = Array.FindAll(_values, x => (x.ToLower().Contains(word.ToLower()))); if (matches.Length > 0) { ShowListBox(); _listBox.BeginUpdate(); _listBox.Items.Clear(); Array.ForEach(matches, x => _listBox.Items.Add(x)); _listBox.SelectedIndex = 0; _listBox.Height = 0; _listBox.Width = 0; Focus(); using (Graphics graphics = _listBox.CreateGraphics()) { for (int i = 0; i < _listBox.Items.Count; i++) { if (i < 20) _listBox.Height += _listBox.GetItemHeight(i); // it item width is larger than the current one // set it to the new max item width // GetItemRectangle does not work for me // we add a little extra space by using '_' int itemWidth = (int)graphics.MeasureString(((string)_listBox.Items[i]) + "_", _listBox.Font).Width; _listBox.Width = (_listBox.Width < itemWidth) ? itemWidth : this.Width; ; } } _listBox.EndUpdate(); } else { ResetListBox(); } } else { ResetListBox(); } } public String[] Values { get { return _values; } set { _values = value; } } public List<String> SelectedValues { get { String[] result = Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); return new List<String>(result); } } }