C # Использование нескольких результатов базы данных со списками, которые (при выборе элемента) отображают информацию в текстовых полях - PullRequest
0 голосов
/ 12 июля 2011

Я работаю над кулинарной книгой, используя базу данных.Я работал с учебными пособиями, чтобы построить свой проект, так как я все еще только начинающий.

Я уже спрашивал, как искать базу данных с помощью кнопки, и помощь была настолько быстрой, что мне придется задать еще один вопрос.

Вот проблема:

Моя форма позволяет пользователю найти рецепты, которые содержат определенный ингредиент.Это позволяет им вводить ингредиент в текстовое поле, а кнопка показывает все результаты (имена рецептов) в списке.Эта часть была успешно закодирована, благодаря помощи здесь.Однако после того, как поле со списком заполнено, я бы хотел, чтобы пользователь мог выбрать рецепт из списка, а текстовые поля рядом со списком заполняются информацией о данных конкретного рецепта (таких как ингредиенты, указания и дополнительная информация).комментарии).

Какие рецепты заполняют список, зависит от пользователя, так что я не могу написать это без какой-то серьезной логики, верно?

Вот код для всей моей формы:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Collections;


namespace Cookbook
{
    public partial class BrowseIngredients : Form
    {
        public BrowseIngredients()
        {
            InitializeComponent();
        }

        SqlConnection con;
        SqlDataAdapter dataAdapt;
        DataSet dataRecipe;
        int MaxRows = 0;
        int inc = 0;


        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Exit Cook Book?", "Exit?", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                Application.Exit();
            }
        }

        private void btnBack_Click(object sender, EventArgs e)
        {
            BrowseRecipes goBack = new BrowseRecipes();

            Close();
            goBack.Show();
        }

        private void howToSearchToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("To look for recipes with ingredients you have, simply type in the first ingredient you have to cook. \r\n To narrow your search, add another ingredient you'd like to search for in the recipe results.", "Search by Ingredients");
        }


        private void BrowseIngredients_Load(object sender, EventArgs e)
        {

            con = new SqlConnection();
            con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\Cady Wong\\My Documents\\Visual Studio 2010\\Projects\\Cookbook\\Cookbook\\Recipes.mdf;Integrated Security=True;User Instance=True";
            dataRecipe = new DataSet();

            con.Open();

           string sql = "SELECT* From CookBookRecipes";
           dataAdapt = new SqlDataAdapter(sql, con);
           dataAdapt.Fill(dataRecipe, "CookBookRecipes");
           NavigateRecords();
           MaxRows = dataRecipe.Tables["CookBookRecipes"].Rows.Count;

            con.Close();

        }

        private void NavigateRecords()
        {
            DataRow dRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];

        }


//This is the search and populate listbox code //


        private void btnSearch_Click(object sender, EventArgs e)
        {


            if (tbSearch.TextLength >= 1)
           {
                //MessageBox.Show("This will work when you put in a word!");

               listBox1.Items.Clear();

                string searchOut = tbSearch.Text;
                int result = 0;

                DataRow[] returnRows;

                returnRows = dataRecipe.Tables["CookBookRecipes"].Select("Recipe_Ingredients LIKE '*" + searchOut + "*'");


                result = returnRows.Length;

//This allows mutiple results to be seen one line after another //

                if (result > 0)
                {
                    string temp ="";
                    DataRow rowBack;
                    for (int index = 0; index < returnRows.Count(); index++ )
                    {
                        rowBack = returnRows[index];
                        listBox1.Items.Add(rowBack[0].ToString());
                        temp += rowBack[0].ToString();
                        temp += "\n";
                    }

                }
                else
                {
                    MessageBox.Show("No record");
                }

           }

           else
            {
               MessageBox.Show("Please enter an ingredient to search for!", "Search");
           }
        }

    }
}

Если вам нужна дополнительная информация, просто дайте мне знать!

Заранее спасибо!

1 Ответ

0 голосов
/ 12 июля 2011

Хорошо, я на самом деле не предоставил ответ - еще несколько советов, которые, надеюсь, подтолкнут вас не только в этом проекте, но и в целом как программист.

На небольшом дополнительном примечании, прежде чем я продолжу, теги «множественный» и «логика» являются особым выбором для вашего вопроса

Относительно BrowseIngredients_Load:

Здесь вы используете SqlConnection, который реализует IDisposable интерфейс.Лучшая практика (и это очень рекомендуется) - всегда использовать Использование шаблона блока при работе с объектами, реализующими IDispoable (по крайней мере, где это возможно).

using (con = New SqlConnection(connectionString)){
    ' use the connection within these bracers
}
' because you used this pattern, the object is disposed correctly, memory deallocated, etc

Следующий битСовет мог бы взглянуть на Linq to SQL (для краткости L2S).L2S является объектно-реляционным картографом .Звучит сложно, но в основном означает, что он отвечает за сопоставление ваших объектов базы данных (таблиц, представлений и т. Д.) С вашей моделью предметной области (классы, Strucutres и т. Д.).Возможно, это звучит немного сложнее, но, поверьте мне, ознакомьтесь с этими простыми уроками, и вам понравится:

Статья CodeProject, включая исходный код

Часть 1 блога / учебных пособий Скотта Гу

доброе старое MSDN Введение в L2S

Примечание: доступно множество ORM, и сама Microsoftпредоставляет Entity Framework, но L2S должен быть легким в освоении и вооружить вас достаточными знаниями, чтобы в будущем сделать осознанный выбор в пользу альтернатив ORM

Если вы пойдете с L2S (который когда-то вы провели паруЧерез несколько часов вы обнаружите, что будете использовать переписывание T-SQL в своем коде каждый раз. Это решает пару других проблем, таких как введение SQL-инъекция , которую Linq сделаетсправиться за вас.

Это также решит вашу общую проблему или почти.С Linq to SQL отображение данных Recipes было бы простым, потому что они были бы просто свойствами класса.

txtIngredients.Text = myAutoGeneratedLinqRecipe.Ingredients;

Я надеюсь, что это поможет вам продвинуться вперед, я уверен, что кто-то еще дасткод для выполнения упражнения без введения новых шаблонов кода и технологий ^^

РЕДАКТИРОВАТЬ: быстрый пример использования блока, чтобы вы поняли:

Private void BrowseIngredients_Load(object sender, EventArgs e)
{
    string connStr = "Data Source=.....etc";
    using (con = New SqlConnection(connStr))
    {
        con.Open
        ' get your data here - if you were losing Linq, you wouldnt have to worry
        ' about connections or Sql at all ;-)
        con.Close
    } ' this ensures that the connection is disposed correctly, even if for example
      ' you throw an exception inside the block which isn't caught
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...