(Visual C#)在用逗号分隔的单词列表中检查数字化时一个单词或一组单词是否正确

时间:2018-07-25 09:34:03

标签: c# visual-studio winforms

我正在使用Visual C#(Visual Studio 2017)和Windows窗体以及数据库(SQL Server)来存储数据。我制定了一个程序,该程序必须检查生产商必须放入化妆品产品中的某些物质。所有程序都能正常工作(即使可悲的是,即使我对语言和程序本身还不是很熟练,所以在我的代码中,我会猜到很多“不太优雅”的部分,或者可能是其他原因)更好)。我的Form带有3个内部控件:1 TextBox,用于检查生产者提供的物质; 1 RichTextBox给出结果,告诉我使用不同颜色允许,禁止或部分允许使用哪种物质; 1个按钮,当用户单击该按钮时,程序将在TextBox中读取用逗号分隔的物质列表,并将这些物质在RichTextBox中的另一种下放置,并在其旁边放置“允许”等。示例:

  • 我在以下文本框中粘贴:Aqua,辛酸/癸酸甘油三酯,山梨糖醇硬脂酸酯,甘油,香精
  • 我按下名为“检查”的按钮
  • 我得到您在RichTextBox图片中看到的内容。

Image of the screen with the results

您可以在左侧看到物质,在右侧看到带有“è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();

            }

因此,这是我用来检查一种物质的代码,所有代码都可以正常工作。问题是如果我需要检查一个单词...在其他单词中间。如果我需要检查/修改甘油,则可以与“甘油”完美配合,但不能与“水,甘油,香精”一起使用。我尝试了很多事情,并检查了许多示例,但到目前为止没有任何效果。有没有一种方法可以使我的代码适应用于单词列表的单个单词? 在此先感谢您(如果我的代码太糟糕了,对不起,因为我说我还不是专家...还^^'')。

2 个答案:

答案 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)

从单个文本框中处理对象/名称列表是个坏主意。

您需要像这样更改代码结构。

  1. 更改文本时,请用逗号分隔提取单词。 (就像您现在所做的那样)
  2. 将这些单词存储在列表中。
  3. 在某种列表中显示这些单词(例如,提取的单词)。
  4. 单击“提取的单词” 项,将选定的值填充到第二个文本框(已启用自动完成功能)
  5. 启用自动完成功能的文本框将具有一个按钮,用于更新“提取的单词” 列表。
  6. 现在您可以按“检查”按钮(您已经有此按钮),它将在“提取的单词”列表中检查“允许”,“不允许”等。