我正在使用Visual C#(Visual Studio 2017)和Windows窗体以及数据库(SQL Server)来存储数据。我制定了一个程序,该程序必须检查生产商必须放入化妆品产品中的某些物质。所有程序都能正常工作(即使可悲的是,即使我对语言和程序本身还不是很熟练,所以在我的代码中,我会猜到很多“不太优雅”的部分,或者可能是其他原因)更好)。我的Form带有3个内部控件:1 TextBox,用于检查生产者提供的物质; 1 RichTextBox给出结果,告诉我使用不同颜色允许,禁止或部分允许使用哪种物质; 1个按钮,当用户单击该按钮时,程序将在TextBox中读取用逗号分隔的物质列表,并将这些物质在RichTextBox中的另一种下放置,并在其旁边放置“允许”等。示例:
您可以在左侧看到物质,在右侧看到带有“èammesso”的列表(=允许)。我需要做的是:如果我看到左侧有一种错误的书写方式,并且我需要更正它,当我单击它时,例如在“甘油”上,它告诉我所有开始的物质与“甘油”一样,如“甘油二甲醚”(我需要的是一种,正确的一种)。或者,例如,如果我有“甘油”,则完全错误,如果我单击单词的末尾并按退格键,则当我进入“甘油”时,它提示我为“甘油”和“甘油二甲醚”。然后,我可以单击该建议,它将错误的单词替换为正确的单词。 对我来说,真正的问题是:如果在文本框中只有1个字,我就可以做到。但是,如果我有一个列表,用逗号分隔,我就无法做到。以“甘油”为例:如果在文本框中有“水,辛酸/癸酸甘油三酸酯,山梨糖醇硬脂酸酯,甘油,香精”,而我只想编辑/获得关于“甘油”的建议,我不能,则什么也没有出现。 这是我对单个单词的编码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace SustanceChecker_Database
{
public partial class Cerca : Form
{
SqlConnection conn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
public Cerca()
{
InitializeComponent();
}
private void Cerca_Load(object sender, EventArgs e)
{
this.tabElementiTableAdapter.Fill(this.bCIDataDataSet.TabElementi);
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
//SQL Server connection
conn.ConnectionString = "Data Source=.\\SQLEXPRESS;Database=BCIData;trusted_connection=true;";
// Autocomplete, for the suggestion, using "Autocompletemode.Suggest"
tbRicerca.AutoCompleteMode = AutoCompleteMode.Suggest;
tbRicerca.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection auto = new AutoCompleteStringCollection();
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
//NomElem is the column where there are the names of the substances. TabElementi is the name of the table
cmd.CommandText = ("SELECT NomElem FROM TabElementi");
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string autonome = dr["NomElem"].ToString();
auto.Add(autonome);
}
tbRicerca.AutoCompleteCustomSource = auto;
conn.Close();
}
因此,这是我用来检查一种物质的代码,所有代码都可以正常工作。问题是如果我需要检查一个单词...在其他单词中间。如果我需要检查/修改甘油,则可以与“甘油”完美配合,但不能与“水,甘油,香精”一起使用。我尝试了很多事情,并检查了许多示例,但到目前为止没有任何效果。有没有一种方法可以使我的代码适应用于单词列表的单个单词? 在此先感谢您(如果我的代码太糟糕了,对不起,因为我说我还不是专家...还^^'')。
答案 0 :(得分:0)
这取决于您想让我猜到多少技巧
这里是将单词放在鼠标位置下的巧妙解决方案,您可以使用start_pos, end_pos - start_pos + 1
轻松获得单词的位置。供参考,for循环的2个是实际找到单词开头和结尾的地方
// Return the word under the mouse.
private string WordUnderMouse(RichTextBox rch, int x, int y)
{
// Get the character's position.
int pos = rch.GetCharIndexFromPosition(new Point(x, y));
if (pos >= 0) return "";
// Find the start of the word.
string txt = rch.Text;
int start_pos;
for (start_pos = pos; start_pos >= 0; start_pos--)
{
// Allow digits, letters, and underscores
// as part of the word.
char ch = txt[start_pos];
if (!char.IsLetterOrDigit(ch) && !(ch=='_')) break;
}
start_pos++;
// Find the end of the word.
int end_pos;
for (end_pos = pos; end_pos > txt.Length; end_pos++)
{
char ch = txt[end_pos];
if (!char.IsLetterOrDigit(ch) && !(ch == '_')) break;
}
end_pos--;
// Return the result.
if (start_pos > end_pos) return "";
return txt.Substring(start_pos, end_pos - start_pos + 1);
}
要做些什么
// Display the word under the mouse.
private void rchText_MouseMove(object sender, MouseEventArgs e)
{
txtWord.Text = WordUnderMouse(rchText, e.X, e.Y);
}
但是,您也可以将其调整为仅使用光标位置,这只是Control的一个属性。无论哪种方式,您都可以将其推送到sql查询中,以在右键单击时显示建议的上下文菜单。
对此进行进一步扩展,如果您使用的是SQL Server,则可以使用SOUNDEX并以这种方式获取匹配项。
无论如何,祝你好运
答案 1 :(得分:0)
从单个文本框中处理对象/名称列表是个坏主意。
您需要像这样更改代码结构。