2008-09-04 20 views
5

टेक्स्ट बॉक्स को विकसित करने का सबसे अच्छा तरीका क्या होगा जो उसमें डाली गई प्रविष्टियों की अंतिम x संख्या को याद रखे। यह सी # के साथ लिखा गया एक स्टैंडअलोन ऐप है।Google सुझाव बॉक्स बॉक्स (स्वतः पूर्ण)

उत्तर

3

@Ethan

मैं तथ्य यह है कि आप को बचाने के लिए है कि तो यह प्रति सत्र नहीं एक था चाहेगा बारे में भूल गया केवल बात: पी लेकिन हाँ, आप पूरी तरह से सही हैं।

यह आसानी से किया जाता है, खासकर जब से यह केवल मूल स्ट्रिंग है, बस टेक्स्टबॉक्स से ऑटोकंपलेट कस्टम कस्टमर्स की सामग्री को अलग-अलग पंक्तियों पर टेक्स्ट फ़ाइल में लिखें।

मेरे पास कुछ मिनट थे, इसलिए मैंने एक पूर्ण कोड उदाहरण लिखा ... मैं पहले से ही कोड दिखाने की कोशिश करता था, लेकिन समय नहीं था। वैसे भी, यहां पूरी बात है (डिजाइनर कोड से कम)।

namespace AutoComplete 
{ 
    public partial class Main : Form 
    { 
     //so you don't have to address "txtMain.AutoCompleteCustomSource" every time 
     AutoCompleteStringCollection acsc; 
     public Main() 
     { 
      InitializeComponent(); 

      //Set to use a Custom source 
      txtMain.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      //Set to show drop down *and* append current suggestion to end 
      txtMain.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
      //Init string collection. 
      acsc = new AutoCompleteStringCollection(); 
      //Set txtMain's AutoComplete Source to acsc 
      txtMain.AutoCompleteCustomSource = acsc; 
     } 

     private void txtMain_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 
       //Only keep 10 AutoComplete strings 
       if (acsc.Count < 10) 
       { 
        //Add to collection 
        acsc.Add(txtMain.Text); 
       } 
       else 
       { 
        //remove oldest 
        acsc.RemoveAt(0); 
        //Add to collection 
        acsc.Add(txtMain.Text); 
       } 
      } 
     } 

     private void Main_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      //open stream to AutoComplete save file 
      StreamWriter sw = new StreamWriter("AutoComplete.acs"); 

      //Write AutoCompleteStringCollection to stream 
      foreach (string s in acsc) 
       sw.WriteLine(s); 

      //Flush to file 
      sw.Flush(); 

      //Clean up 
      sw.Close(); 
      sw.Dispose(); 
     } 

     private void Main_Load(object sender, EventArgs e) 
     { 
      //open stream to AutoComplete save file 
      StreamReader sr = new StreamReader("AutoComplete.acs"); 

      //initial read 
      string line = sr.ReadLine(); 
      //loop until end 
      while (line != null) 
      { 
       //add to AutoCompleteStringCollection 
       acsc.Add(line); 
       //read again 
       line = sr.ReadLine(); 
      } 

      //Clean up 
      sr.Close(); 
      sr.Dispose(); 
     } 
    } 
} 

इस कोड को बिल्कुल के रूप में कार्य करेंगे, तो आप सिर्फ txtMain नाम के एक पाठ बॉक्स के साथ जीयूआई बनाने और पाठबॉक्स और मुख्य रूप के लिए KeyDown, बंद और इवेंट लोड अप हुक करने की जरूरत है।

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

इसके अलावा, संग्रह को पॉप्युलेट करने के लिए उपयोग किया जाने वाला मॉडल बहुत "स्मार्ट" नहीं है। जब संग्रह 10 की सीमा तक पहुंच जाता है तो यह सबसे पुरानी स्ट्रिंग को हटा देता है। यह संभवतः आदर्श नहीं है, लेकिन उदाहरण के लिए काम करता है।आप शायद रेटिंग प्रणाली के कुछ प्रकार चाहेगा

एक अंतिम टिप्पणी, सुझाव वास्तव में जिस क्रम में वे संग्रह में हैं में दिखाई देगा (विशेष रूप से यदि आप वास्तव में यह गूगल-ish होना चाहते हैं)। अगर किसी कारण से आप उन्हें अलग दिखाना चाहते हैं, तो बस अपनी पसंद की सूची को सॉर्ट करें।

आशा है कि मदद करता है!

6

यह वास्तव में काफी आसान है, खासकर "ऑटोकंपलेट" भाग दिखाने के संदर्भ में। प्रविष्टियों की अंतिम एक्स संख्या को याद रखने के मामले में, आपको केवल एक विशेष घटना (या घटनाओं) पर निर्णय लेना होगा, जिसे आप एक प्रविष्टि के रूप में मानते हैं और उस प्रविष्टि को किसी सूची में लिखते हैं ... एक स्वत: पूर्ण करने के लिए चयन सटीक।

  • AutoCompleteCustomSource
  • AutoCompleteMode
  • AutoCompleteSource

सेट CustomSource को SuggestAppend और AutoCompleteSource को AutoCompleteMode:

पाठ बॉक्स वर्ग 3 निम्नलिखित गुण है कि आप की आवश्यकता होगी है।

फिर रनटाइम पर, हर बार एक नई प्रविष्टि बनाई जाती है, तो सूची में उस प्रविष्टि को जोड़ने के लिए ऑटोकंपलेटस्टिंग कोलेक्शन की जोड़ें() विधि का उपयोग करें (और यदि आप चाहें तो किसी भी पुराने को पॉप करें)। जब तक आप इसे पहले ही प्रारंभ कर चुके हैं, तब तक आप वास्तव में टेक्स्टबॉक्स की स्वत: पूर्ण CustomSource प्रॉपर्टी पर यह ऑपरेशन कर सकते हैं।

अब, हर बार जब आप पाठ बॉक्स में टाइप करें यह पिछले प्रविष्टियों :)

अधिक पूर्ण उदाहरण के लिए यह लेख देखें सुझाव देगा: http://www.c-sharpcorner.com/UploadFile/mahesh/AutoCompletion02012006113508AM/AutoCompletion.aspx

स्वत: पूर्ण भी कुछ FileSystem और यूआरएल जैसी सुविधाओं में बनाया गया है (हालांकि यह सिर्फ सामान कि IE में टाइप कर रहा था ...) करता है

1

मैं रजिस्ट्री में पूरा होने सूची संग्रहीत।

कोड का उपयोग मैं नीचे है। यह पुन: प्रयोज्य है, तीन चरणों में:

  1. जो भी आप उपयोग करते हैं, इस कोड में नेमस्पेस और क्लासनाम को प्रतिस्थापित करें।
  2. फार्म के लोड घटना पर कॉल FillFormFromRegistry(), और समापन घटना पर SaveFormToRegistry कहते हैं।
  3. इसे अपने प्रोजेक्ट में संकलन।

आपको असेंबली को दो विशेषताओं के साथ सजाने की जरूरत है: [assembly: AssemblyProduct("...")] और [assembly: AssemblyCompany("...")]। (इन विशेषताओं सामान्य रूप से दृश्य स्टूडियो में बनाई गई परियोजनाओं में स्वचालित रूप से स्थापित कर रहे हैं, तो मैं एक कदम के रूप में इस गिनती नहीं है।)

राज्य प्रबंध इस तरह से पूरी तरह से स्वचालित और उपयोगकर्ता के लिए पारदर्शी है।

आप अपने WPF या WinForms अनुप्रयोग के लिए राज्य के किसी भी प्रकार के स्टोर करने के लिए एक ही पैटर्न का उपयोग कर सकते हैं। टेक्स्टबॉक्स, चेकबॉक्स, ड्रॉपडाउन की स्थिति की तरह। इसके अलावा आप store/restore the size of the window कर सकते हैं - वास्तव में आसान - अगली बार उपयोगकर्ता ऐप चलाता है, यह उसी स्थान पर खुलता है, और उसी आकार के साथ, जब उन्होंने इसे बंद कर दिया। आप store the number of times an app has been run कर सकते हैं। बहुत सारी संभावनाएं

namespace Ionic.ExampleCode 
{ 
    public partial class NameOfYourForm 
    { 
     private void SaveFormToRegistry() 
     { 
      if (AppCuKey != null) 
      { 
       // the completion list 
       var converted = _completions.ToList().ConvertAll(x => x.XmlEscapeIexcl()); 
       string completionString = String.Join("¡", converted.ToArray()); 
       AppCuKey.SetValue(_rvn_Completions, completionString); 
      } 
     } 

     private void FillFormFromRegistry() 
     { 
      if (!stateLoaded) 
      { 
       if (AppCuKey != null) 
       { 
        // get the MRU list of .... whatever 
        _completions = new System.Windows.Forms.AutoCompleteStringCollection(); 
        string c = (string)AppCuKey.GetValue(_rvn_Completions, ""); 
        if (!String.IsNullOrEmpty(c)) 
        { 
         string[] items = c.Split('¡'); 
         if (items != null && items.Length > 0) 
         { 
          //_completions.AddRange(items); 
          foreach (string item in items) 
           _completions.Add(item.XmlUnescapeIexcl()); 
         } 
        } 

        // Can also store/retrieve items in the registry for 
        // - textbox contents 
        // - checkbox state 
        // - splitter state 
        // - and so on 
        // 
        stateLoaded = true; 
       } 
      } 
     } 

     private Microsoft.Win32.RegistryKey AppCuKey 
     { 
      get 
      { 
       if (_appCuKey == null) 
       { 
        _appCuKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(AppRegistryPath, true); 
        if (_appCuKey == null) 
         _appCuKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(AppRegistryPath); 
       } 
       return _appCuKey; 
      } 
      set { _appCuKey = null; } 
     } 

     private string _appRegistryPath; 
     private string AppRegistryPath 
     { 
      get 
      { 
       if (_appRegistryPath == null) 
       { 
        // Use a registry path that depends on the assembly attributes, 
        // that are presumed to be elsewhere. Example: 
        // 
        // [assembly: AssemblyCompany("Dino Chiesa")] 
        // [assembly: AssemblyProduct("XPathVisualizer")] 

        var a = System.Reflection.Assembly.GetExecutingAssembly(); 
        object[] attr = a.GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), true); 
        var p = attr[0] as System.Reflection.AssemblyProductAttribute; 
        attr = a.GetCustomAttributes(typeof(System.Reflection.AssemblyCompanyAttribute), true); 
        var c = attr[0] as System.Reflection.AssemblyCompanyAttribute; 

        _appRegistryPath = String.Format("Software\\{0}\\{1}", 
                p.Product, c.Company); 
       } 
       return _appRegistryPath; 
      } 
     } 

     private Microsoft.Win32.RegistryKey _appCuKey; 
     private string _rvn_Completions = "Completions"; 
     private readonly int _MaxMruListSize = 14; 
     private System.Windows.Forms.AutoCompleteStringCollection _completions; 
     private bool stateLoaded; 
    } 

    public static class Extensions 
    { 
     public static string XmlEscapeIexcl(this String s) 
     { 
      while (s.Contains("¡")) 
      { 
       s = s.Replace("¡", "&#161;"); 
      } 
      return s; 
     } 
     public static string XmlUnescapeIexcl(this String s) 
     { 
      while (s.Contains("&#161;")) 
      { 
       s = s.Replace("&#161;", "¡"); 
      } 
      return s; 
     } 

     public static List<String> ToList(this System.Windows.Forms.AutoCompleteStringCollection coll) 
     { 
      var list = new List<String>(); 
      foreach (string item in coll) 
      { 
       list.Add(item); 
      } 
      return list; 
     } 
    } 
} 

कुछ लोगों shy away from using the Registry for storing state, लेकिन मैं यह वास्तव में आसान और सुविधाजनक है सकते हैं। यदि आप चाहें, तो आप आसानी से एक इंस्टॉलर बना सकते हैं जो अनइंस्टॉल करने पर सभी रजिस्ट्री कुंजियों को हटा देता है।