दिलचस्प पोस्ट
एक jQuery datagrid प्लगइन का चयन? ActionBar / टूलबार पर और स्थिति पट्टी के नीचे प्रदर्शित करने के लिए मैं ड्रेवर लयआउट का उपयोग कैसे करूं? जावा स्विंग में MouseMotionListener, घटकों के अंदर घटकों के साथ इसे उपयोग करते हुए पास जावास्क्रिप्ट ऐरे -> PHP क्या 'रिक्त' कन्स्ट्रक्टर या डिस्ट्रिक्टर एक ही चीज़ को उत्पन्न करेगा? मैं पर्ल प्रोग्राम में कमांड लाइन आर्ग्यूमेंट कैसे चला सकता हूं? NSUserDefaults में एक NSDate भंडारण का इष्टतम तरीका क्या है? क्या सी # के 'उपज' कीवर्ड के बराबर एक जावा है? कम्पाइलर्स और सी ++ में मूल्यांकन का तर्क क्रम अक्षांश या देशांतर मीटर को कैसे परिवर्तित करें? पायथन 3 के साथ आईएनआई फाइल कैसे पढ़ा और लिखी? एक स्थानीय फाइल सिस्टम पर `लिखने (2)` परमाणुता Android पर क्वेरी स्ट्रिंग पार्स करना एक सी # कार्यक्रम के अंदर एक बाह्य निष्पादन योग्य एम्बेडिंग एंड्रॉइड में वैश्विक असंतुलित अपवाद हैंडलर सेट करने का आदर्श तरीका

सी # स्वत: पूर्ण

मैं एक पाठ बॉक्स में एक स्वत: पूर्ण सुविधा को जोड़ने का प्रयास कर रहा हूं, परिणाम डेटाबेस से आ रहे हैं। वे इसके प्रारूप में आते हैं

[001] अंतिम, पहले मध्य

वर्तमान में आपको प्रविष्टियों को दिखाने के लिए [001] … टाइप करना होगा। तो समस्या यह है कि मैं इसे पूरा करना चाहता हूं, भले ही मैं सबसे पहला पहला नाम टाइप करता हूं । तो अगर एक प्रविष्टि थी

[001] स्मिथ, जॉन डी

अगर मैं जॉन टाइप करना शुरू कर देता हूं तो इस प्रविष्टि को ऑटो पूर्ण के परिणाम में दिखाना चाहिए।

वर्तमान में कोड कुछ ऐसा दिखता है

AutoCompleteStringCollection acsc = new AutoCompleteStringCollection(); txtBox1.AutoCompleteCustomSource = acsc; txtBox1.AutoCompleteMode = AutoCompleteMode.Suggest; txtBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; .... if (results.Rows.Count > 0) for (int i = 0; i < results.Rows.Count && i < 10; i++) { row = results.Rows[i]; acsc.Add(row["Details"].ToString()); } } 

परिणाम एक डेटसेट है जिसमें क्वेरी परिणाम शामिल हैं

क्वेरी समान बयान का उपयोग करते हुए एक सरल खोज क्वेरी है। अगर हम स्वत: पूर्ण उपयोग नहीं करते हैं और परिणाम को केवल एक सरणी में टॉस करते हैं, तो सही परिणाम लौटाए जाते हैं।

कोई सलाह?

संपादित करें:

यहाँ क्वेरी है जो परिणाम देता है

 SELECT Name from view_customers where Details LIKE '{0}' 

खोज स्ट्रिंग के लिए प्लेसहोल्डर होने के साथ {0}।

वेब के समाधान से एकत्रित समाधान "सी # स्वत: पूर्ण"

मौजूदा स्वत: पूर्ण कार्यक्षमता केवल उपसर्ग द्वारा खोज का समर्थन करती है व्यवहार को ओवरराइड करने के लिए कोई सभ्य तरीका नहीं है।

OnTextChanged ईवेंट को ओवरराइड करते OnTextChanged कुछ लोगों ने स्वयं के स्वत: पूर्ण कार्यों को कार्यान्वित किया है। यह शायद आपका सबसे अच्छा शर्त है

उदाहरण के लिए, आप ListBox के नीचे एक ListBox जोड़ सकते हैं और इसकी डिफ़ॉल्ट दृश्यता को गलत पर सेट कर सकते हैं। उसके बाद आप OnTextChanged TextBox के OnTextChanged ईवेंट और आइटम का चयन और चयन करने के लिए ListBox के SelectedIndexChanged ईवेंट का उपयोग कर सकते हैं।

यह एक अल्पविकसित उदाहरण के रूप में बहुत अच्छी तरह से काम करता है:

 public Form1() { InitializeComponent(); acsc = new AutoCompleteStringCollection(); textBox1.AutoCompleteCustomSource = acsc; textBox1.AutoCompleteMode = AutoCompleteMode.None; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; } private void button1_Click(object sender, EventArgs e) { acsc.Add("[001] some kind of item"); acsc.Add("[002] some other item"); acsc.Add("[003] an orange"); acsc.Add("[004] i like pickles"); } void textBox1_TextChanged(object sender, System.EventArgs e) { listBox1.Items.Clear(); if (textBox1.Text.Length == 0) { hideResults(); return; } foreach (String s in textBox1.AutoCompleteCustomSource) { if (s.Contains(textBox1.Text)) { Console.WriteLine("Found text in: " + s); listBox1.Items.Add(s); listBox1.Visible = true; } } } void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) { textBox1.Text = listBox1.Items[listBox1.SelectedIndex].ToString(); hideResults(); } void listBox1_LostFocus(object sender, System.EventArgs e) { hideResults(); } void hideResults() { listBox1.Visible = false; } 

बहुत अधिक प्रयास किए बिना आप बहुत अधिक प्रयास कर सकते हैं: पाठ बॉक्स में टेक्स्ट संलग्न करें, अतिरिक्त कुंजीपटल आदेश कैप्चर करें, और बहुत आगे।

यदि आप उपयोगकर्ता इनपुट पर आधारित एक क्वेरी का उपयोग करने का निर्णय लेते हैं तो सुनिश्चित करें कि आप SQL इंजेक्शन हमलों से बचने के लिए SqlParameters का उपयोग करते हैं

 SqlCommand sqlCommand = new SqlCommand(); sqlCommand.CommandText = "SELECT Name from view_customers where Details LIKE '%" + @SearchParam + "%'"; sqlCommand.Parameters.AddWithValue("@SearchParam", searchParam); 

यहां एक कार्यान्वयन है, जो ComboBox नियंत्रण कक्षा को प्राप्त करता है, नए कंट्रोल के साथ पूरे कॉम्बो बॉक्स की बजाय। जब आप पाठ बॉक्स में टाइप करते हैं, लेकिन ड्रॉप-लिस्ट को दिखाने के लिए क्लिक करने से पहले इसे (या इस कोड के साथ नहीं) पर क्लिक करते समय यह अपने ड्रॉप-डाउन प्रदर्शित करता है। जैसे आपको उचित देशी नियंत्रण मिलता है और देखो।

कृपया इसे इस्तेमाल करें, इसे संशोधित करें और जवाब संपादित करें यदि आप इसे सुधारना चाहते हैं!

 class ComboListMatcher : ComboBox, IMessageFilter { private Control ComboParentForm; // Or use type "Form" private ListBox listBoxChild; private int IgnoreTextChange; private bool MsgFilterActive = false; public ComboListMatcher() { // Set up all the events we need to handle TextChanged += ComboListMatcher_TextChanged; SelectionChangeCommitted += ComboListMatcher_SelectionChangeCommitted; LostFocus += ComboListMatcher_LostFocus; MouseDown += ComboListMatcher_MouseDown; HandleDestroyed += ComboListMatcher_HandleDestroyed; } void ComboListMatcher_HandleDestroyed(object sender, EventArgs e) { if (MsgFilterActive) Application.RemoveMessageFilter(this); } ~ComboListMatcher() { } private void ComboListMatcher_MouseDown(object sender, MouseEventArgs e) { HideTheList(); } void ComboListMatcher_LostFocus(object sender, EventArgs e) { if (listBoxChild != null && !listBoxChild.Focused) HideTheList(); } void ComboListMatcher_SelectionChangeCommitted(object sender, EventArgs e) { IgnoreTextChange++; } void InitListControl() { if (listBoxChild == null) { // Find parent - or keep going up until you find the parent form ComboParentForm = this.Parent; if (ComboParentForm != null) { // Setup a messaage filter so we can listen to the keyboard if (!MsgFilterActive) { Application.AddMessageFilter(this); MsgFilterActive = true; } listBoxChild = listBoxChild = new ListBox(); listBoxChild.Visible = false; listBoxChild.Click += listBox1_Click; ComboParentForm.Controls.Add(listBoxChild); ComboParentForm.Controls.SetChildIndex(listBoxChild, 0); // Put it at the front } } } void ComboListMatcher_TextChanged(object sender, EventArgs e) { if (IgnoreTextChange > 0) { IgnoreTextChange = 0; return; } InitListControl(); if (listBoxChild == null) return; string SearchText = this.Text; listBoxChild.Items.Clear(); // Don't show the list when nothing has been typed if (!string.IsNullOrEmpty(SearchText)) { foreach (string Item in this.Items) { if (Item != null && Item.Contains(SearchText, StringComparison.CurrentCultureIgnoreCase)) listBoxChild.Items.Add(Item); } } if (listBoxChild.Items.Count > 0) { Point PutItHere = new Point(this.Left, this.Bottom); Control TheControlToMove = this; PutItHere = this.Parent.PointToScreen(PutItHere); TheControlToMove = listBoxChild; PutItHere = ComboParentForm.PointToClient(PutItHere); TheControlToMove.Show(); TheControlToMove.Left = PutItHere.X; TheControlToMove.Top = PutItHere.Y; TheControlToMove.Width = this.Width; int TotalItemHeight = listBoxChild.ItemHeight * (listBoxChild.Items.Count + 1); TheControlToMove.Height = Math.Min(ComboParentForm.ClientSize.Height - TheControlToMove.Top, TotalItemHeight); } else HideTheList(); } /// <summary> /// Copy the selection from the list-box into the combo box /// </summary> private void CopySelection() { if (listBoxChild.SelectedItem != null) { this.SelectedItem = listBoxChild.SelectedItem; HideTheList(); this.SelectAll(); } } private void listBox1_Click(object sender, EventArgs e) { var ThisList = sender as ListBox; if (ThisList != null) { // Copy selection to the combo box CopySelection(); } } private void HideTheList() { if (listBoxChild != null) listBoxChild.Hide(); } public bool PreFilterMessage(ref Message m) { if (m.Msg == 0x201) // Mouse click: WM_LBUTTONDOWN { var Pos = new Point((int)(m.LParam.ToInt32() & 0xFFFF), (int)(m.LParam.ToInt32() >> 16)); var Ctrl = Control.FromHandle(m.HWnd); if (Ctrl != null) { // Convert the point into our parent control's coordinates ... Pos = ComboParentForm.PointToClient(Ctrl.PointToScreen(Pos)); // ... because we need to hide the list if user clicks on something other than the list-box if (ComboParentForm != null) { if (listBoxChild != null && (Pos.X < listBoxChild.Left || Pos.X > listBoxChild.Right || Pos.Y < listBoxChild.Top || Pos.Y > listBoxChild.Bottom)) { this.HideTheList(); } } } } else if (m.Msg == 0x100) // WM_KEYDOWN { if (listBoxChild != null && listBoxChild.Visible) { switch (m.WParam.ToInt32()) { case 0x1B: // Escape key this.HideTheList(); return true; case 0x26: // up key case 0x28: // right key // Change selection int NewIx = listBoxChild.SelectedIndex + ((m.WParam.ToInt32() == 0x26) ? -1 : 1); // Keep the index valid! if (NewIx >= 0 && NewIx < listBoxChild.Items.Count) listBoxChild.SelectedIndex = NewIx; return true; case 0x0D: // return (use the currently selected item) CopySelection(); return true; } } } return false; } } 

यदि आप उस क्वेरी को चला रहे हैं ( {0} को स्ट्रिंग द्वारा प्रतिस्थापित किया गया है), तो आपको इसकी आवश्यकता हो सकती है:

 SELECT Name from view_customers where Details LIKE '%{0}%' 

अभी भी % वर्ण की आवश्यकता है … और हाँ, आपको उपयोगकर्ता के इनपुट पर भरोसा करने के बजाय पैरामीटर का उपयोग करना चाहिए 🙂

इसके अलावा, आप Name कॉलम लौटते हैं, लेकिन Details कॉलम पर पूछताछ करते हैं। इसलिए यदि "जॉन स्मिथ" में कोई प्रकार है, यदि वह Details कॉलम में नहीं है तो आपको वह वापस नहीं मिलेगा जो आपको वापस चाहिए।

यह आपके लिए AUTOCOMPLETE व्यवहार की तलाश कर रहा है।

संलग्न उदाहरण एक पूर्ण कार्यप्रणाली है, बस आपके डेटा स्रोत की आवश्यकता है, और बाउंड कॉलम नाम हैं।

 using System; using System.Data; using System.Windows.Forms; public partial class frmTestAutocomplete : Form { private DataTable maoCompleteList; private const string MC_DISPLAY_COL = "name"; private const string MC_ID_COL = "id"; public frmTestAutocomplete() { InitializeComponent(); } private void frmTestAutocomplete_Load(object sender, EventArgs e) { using (clsDataAccess oData = new clsDataAccess()) { maoCompleteList = oData.PurificationRuns; maoCompleteList.CaseSensitive = false; //turn off case sensitivity for searching testCombo.DisplayMember = MC_DISPLAY_COL; testCombo.ValueMember = MC_ID_COL; testCombo.DataSource = GetDataTableFromDatabase(); testCombo.SelectedIndexChanged += testCombo_SelectedIndexChanged; testCombo.KeyUp += testCombo_KeyUp; } } private void testCombo_KeyUp(object sender, KeyEventArgs e) { //use keyUp event, as text changed traps too many other evengts. ComboBox oBox = (ComboBox)sender; string sBoxText = oBox.Text; DataRow[] oFilteredRows = maoCompleteList.Select(MC_DISPLAY_COL + " Like '%" + sBoxText + "%'"); DataTable oFilteredDT = oFilteredRows.Length > 0 ? oFilteredRows.CopyToDataTable() : maoCompleteList; //NOW THAT WE HAVE OUR FILTERED LIST, WE NEED TO RE-BIND IT WIHOUT CHANGING THE TEXT IN THE ComboBox. //1).UNREGISTER THE SELECTED EVENT BEFORE RE-BINDING, b/c IT TRIGGERS ON BIND. testCombo.SelectedIndexChanged -= testCombo_SelectedIndexChanged; //don't select on typing. oBox.DataSource = oFilteredDT; //2).rebind to filtered list. testCombo.SelectedIndexChanged += testCombo_SelectedIndexChanged; //3).show the user the new filtered list. oBox.DroppedDown = true; //do this before repainting the text, as it changes the dropdown text. //4).binding data source erases text, so now we need to put the user's text back, oBox.Text = sBoxText; oBox.SelectionStart = sBoxText.Length; //5). need to put the user's cursor back where it was. } private void testCombo_SelectedIndexChanged(object sender, EventArgs e) { ComboBox oBox = (ComboBox)sender; if (oBox.SelectedValue != null) { MessageBox.Show(string.Format(@"Item #{0} was selected.", oBox.SelectedValue)); } } } //===================================================================================================== // code from frmTestAutocomplete.Designer.cs //===================================================================================================== partial class frmTestAutocomplete { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.testCombo = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // // testCombo // this.testCombo.FormattingEnabled = true; this.testCombo.Location = new System.Drawing.Point(27, 51); this.testCombo.Name = "testCombo"; this.testCombo.Size = new System.Drawing.Size(224, 21); this.testCombo.TabIndex = 0; // // frmTestAutocomplete // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.testCombo); this.Name = "frmTestAutocomplete"; this.Text = "frmTestAutocomplete"; this.Load += new System.EventHandler(this.frmTestAutocomplete_Load); this.ResumeLayout(false); } #endregion private System.Windows.Forms.ComboBox testCombo; } 

एसक्यूएल के साथ स्वत: पूर्ण पाठ बॉक्स नियंत्रण में दो तरीके सफल रहे:

लेकिन आपको निम्न कार्य करना चाहिए:

एक नई परियोजना बनाएं

b- घटक घटक जोड़ने के लिए घटक वर्ग को जोड़ें और घटक 1 डिज़ाइनर को हटा दें "नाम के अनुसार आप घटक वर्ग को देते हैं"

c- "नमूना डाउनलोड करें – 144.82 KB" डाउनलोड करें और इसे स्वत: पूर्ण टेक्स्टबॉक्स से खोलें और स्वत: पूर्ण पाठ बॉक्स खोलें
डी- सभी को छवि में सचित्र के रूप में चुनें और इसे मौजूदा घटक वर्ग में कॉपी करें

http://img.hiwab.com/c%23/oSqCa.png

ई-फाइनल-रन प्रोजेक्ट और टूल बॉक्स में नए ऑटो कॉम्पलेक्टटेक्स्टबॉक्स को देखने के लिए रोकें।

अब आप उन दो तरीकों को जोड़ सकते हैं जो आप उनके साथ एसक्यूएल का उपयोग कर सकते हैं

1- फॉर्म_लोड में

 private void Form1_Load(object sender, EventArgs e) { SqlConnection cn = new SqlConnection(@"server=.;database=My_dataBase;integrated security=true"); SqlDataAdapter da = new SqlDataAdapter(@"SELECT [MyColumn] FROM [my_table]", cn); DataTable dt = new DataTable(); da.Fill(dt); List<string> myList = new List<string>(); foreach (DataRow row in dt.Rows) { myList.Add((string)row[0]); } autoCompleteTextbox1.AutoCompleteList = myList; } 

2- टेक्स्ट चेंन्ज इवेंट में

  private void autoCompleteTextbox_TextChanged(object sender, EventArgs e) { SqlConnection cn = new SqlConnection(@"server=.;database=My_dataBase;integrated security=true"); SqlDataAdapter da = new SqlDataAdapter(@"SELECT [MyColumn] FROM [my_table]", cn); DataTable dt = new DataTable(); da.Fill(dt); List<string> myList = new List<string>(); foreach (DataRow row in dt.Rows) { myList.Add((string)row[0]); } autoCompleteTextbox2.AutoCompleteList = myList; }