背景:一个可输入textbox,可以实现搜索功能
功能改进需求:把textbox改造成一个可输入的下拉框,下拉框的内容是历史搜索记录(最近20次输入搜索的内容)
代码:
using System.IO;
using System.Text.RegularExpressions;
private ArrayList _arrSearchHistory = null; // 全局变量 form_load时读取.txt文本中的内容
// 放在form_load中
ReadTxtFile(out _arrSearchHistory);
if (_arrSearchHistory != null && _arrSearchHistory.Count > 0)
{
SetComboList(cboFilter, _arrSearchHistory, null, "", false, true);
}
// 加到搜索功能中
if (!string.IsNullOrEmpty(cboFilter.Text) && cboFilter.Text.Trim().Length>1)
{
AddItemToTxt(System.Windows.Forms.Application.StartupPath.Replace(@"bin\Debug", "") + "/Data/SearchHistory.txt", cboFilter.Text,out _arrSearchHistory);
}
//公共函数部分
private void ReadTxtFile(out ArrayList arrFile,int iTopRow=20)
{
arrFile = new ArrayList();
try
{
string sFileFullName = System.Windows.Forms.Application.StartupPath.Replace(@"bin\Debug", "") + @"/Data";
if (!System.IO.Directory.Exists(sFileFullName))
{
System.IO.Directory.CreateDirectory(sFileFullName);
}
sFileFullName += @"/SearchHistory.txt";
if (!System.IO.File.Exists(sFileFullName))
{
//System.IO.File.CreateText(sFileName);
FileStream fs;
fs = File.Create(sFileFullName);
fs.Close();
}
FileStream fsTxtFile = new FileStream(sFileFullName, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fsTxtFile, System.Text.Encoding.Default);
string sTemp;
sTemp = sr.ReadLine();
int iTempRow=0;
while (!string.IsNullOrEmpty(sTemp))
{
iTempRow++;
if (iTempRow > iTopRow)
{
break;
}
arrFile.Add(sTemp);
sTemp = sr.ReadLine();
}
sr.Close();
sr.Dispose();
fsTxtFile.Dispose();
}
catch (Exception ex)
{
Common.DisplayMsg(this.Text, ex.Message.ToString());
}
}
/// <summary>
/// 计算字符串中子串出现的次数
/// </summary>
/// <param name="str">字符串</param>
/// <param name="substring">子串</param>
/// <returns>出现的次数</returns>
public static int SubstringCount(string str, string substring)
{
if (str.Contains(substring))
{
string strReplaced = str.Replace(substring, "");
return (str.Length - strReplaced.Length) / substring.Length;
}
return 0;
}
private void AddItemToTxt(string sFileFullName, string sNewItem,out ArrayList arrFile)
{
arrFile = _arrSearchHistory;
try
{
string sTemp="";
using (StreamReader sr = new StreamReader(sFileFullName))
{
sr.BaseStream.Flush();
sTemp = sr.ReadToEnd();
int iCount = SubstringCount(sTemp, "\r\n");
if (iCount > 20)
{
Regex reg = new Regex("\r\n");
Match mat = reg.Match(sTemp);
int iCountTemp = 0;
while (mat.Success)
{
iCountTemp++;
//MessageBox.Show(mat.Index.ToString());//位置
if (iCountTemp > 20)
{
sTemp = sTemp.Substring(0, mat.Index);
break;
}
mat = reg.Match(sTemp, mat.Index + mat.Length);
}
}
}
//if (File.Exists(sFileFullName))
//{
// File.Delete(sFileFullName);
//}
FileStream fsTxtWrite = new FileStream(sFileFullName, FileMode.Create, FileAccess.Write);
StreamWriter srWrite = new StreamWriter(fsTxtWrite, System.Text.Encoding.UTF8);
//StreamWriter srWrite = new StreamWriter(fsTxtWrite, System.Text.Encoding.Default);
if (!sTemp.Contains(sNewItem))
{
arrFile.Insert(0, sNewItem);
srWrite.WriteLine(sNewItem);
srWrite.Write(sTemp);
}
else
{
srWrite.Write(sTemp);
}
srWrite.Close();
srWrite.Dispose();
fsTxtWrite.Dispose();
}
catch (Exception ex)
{
Common.DisplayMsg(this.Text, ex.Message.ToString());
}
}
// 设置下拉框 传入参数(需要设置的下拉框控件,查询的语句,默认第一行的内容)
public static void SetComboList(DevExpress.XtraEditors.ComboBoxEdit ComboList, ArrayList arrSource = null, DataTable dtSource = null, string FirstRowText = "", bool bSelectFirstItem = false, bool bEditable = false)
{
DataTable dtList = null;
if (dtSource != null)
{
dtList = dtSource;
}
else if (arrSource != null)
{
dtList = new DataTable();
dtList.Columns.Add("name");
foreach (string s in arrSource)
{
dtList.Rows.Add(s);
}
}
else { return; }
int intCount = (dtList != null) ? dtList.Rows.Count : 0;
if (bEditable)
{
ComboList.Properties.TextEditStyle = TextEditStyles.Standard;
}
else
{
ComboList.Properties.TextEditStyle = TextEditStyles.DisableTextEditor; // 设置 comboBox的文本值不能被编辑
}
ComboList.Properties.Items.Clear();
if (!string.IsNullOrEmpty(FirstRowText)) ComboList.Properties.Items.Add(FirstRowText);
if (intCount > 0)
{
for (int i = 0; i < intCount; i++)
{
ComboList.Properties.Items.Add(dtList.Rows[i][0].ToString());
}
}
if (bSelectFirstItem) ComboList.SelectedIndex = 0; // 设置选中第1项
}
public static void DisplayMsg(string sCaption, string sMsg)
{
XtraMessageBox.Show(sMsg, sCaption);
}
希望能帮助到有需要的人。