Сайт переехал на новый адрес: //alexcoder.ucoz.ru
На данном адресе новые материалы выкладываться не будут
Также по новому адресу доступен оффлайн архив материалов
В прошлый раз мы спроектировали структуру(полностью) и дизайн (частично) базы. Правда я добавил табы, на которых собственно теперь лежит dataGridView. Внедрим возможность поиска. Делаем панель, на неё бросим 2-я combobox-а, checkbox и 2 кнопки. У мну вышло так : Для начала сделаем так чтоб было возможно работать с подзапросами. Зачем. Если мы сперва сделаем поиск по наименованию, а потом захотим искать по дате, то запрос по дате будет выглядеть так :
Code
SELECT * FROM (запрос по наименованию) WHERE дата=искомая_дата
Можно было б оптимизировать запрос но это бы усложнило программу.
Так же вставим в проект новую форму. Она будет нужна чтобы юзер сог ввести свой запрос. На неё повесим 2 кнопки и RichText или как-то так Кнопки - OK, Отмена. Создадим в классе int переменную res. По нажатию кнопок будем её менять (Ok - 1, Cancel - 0). Также создадим строковое public property c названием sqlText. в которое будет кидаться текст richEdit-a. Форму кстати обзовём sqlDialog
Вот код моего класса
Code
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;
namespace WindowsFormsApplication1 { public partial class sqlEditDialog : Form { private int res = 0;
public sqlEditDialog() { InitializeComponent(); }
public string sqlText = "";
public virtual int showSQLDialog() { this.ShowDialog(); sqlText = richTextBox1.Text; return res; }
Из основной формы мы будем вызывать showSQLDialog() и если он вернёт 1 - будет выполнять юзерский запрос из sqlText.
Теперь ужасы. Ты считаешь, что в VS 2008 легко проводить запосы к базе данных программно? Как бы не так.
Пришло клепать мозг. Найди в компонентах формы dataSet. В контекстном меню - "EDIT IN DATASET DESIGNER". Дабл клик на свободном месте и мы видим такой код :
public partial class mainDataTableAdapter { public string SelectCommand { get { return CommandCollection[0].CommandText; } set { CommandCollection[0].CommandText = value; } } } }
Мы добавили в dataSet свойство SelectCommand, обёртку для его запроса. Напрямую юзать CommandCollection вроде нельзя.
Теперь в одну из кнопок (обзовём её "свой SQL") код
Code
sqlEditDialog sd = new sqlEditDialog(); sd.showSQLDialog();
Здесь QUERY - private переменная класса (строковая). Кстати компоненты могут обзываться иначе, но вроде смысл пока ясен.
Теперь построим поиск не для гика. Т.е. по полю, значению и галке "в найденном" Один из комбобоксов назовём searchFieldName, второй searchValue, чекбокс " в найденном" - inSearched
Сперва в первый комбобокс нам надо грузить список полей. Сделаем это, используя dataGridView :
Code
private void setFieldsList() { for (int i = 0; i < dataGridView1.Columns.Count; i++) { searchFieldName.Items.Add(dataGridView1.Columns[i].DataPropertyName.ToString()); } } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dbDataSet.mainData' table. You can move, or remove it, as needed. this.mainDataTableAdapter.Fill(this.dbDataSet.mainData); QUERY = mainDataTableAdapter.SelectCommand; setFieldsList(); }
Запустим. Список полей есть.
Теперь поиск.В onclick-е кнопки пиши
Code
if (inSearched.Checked) { QUERY = "SELECT * FROM (" + QUERY + ") WHERE " + searchFieldName.Text + "='" + searchValue.Text + "'"; } else { QUERY = "SELECT * FROM mainData WHERE " + searchFieldName.Text + "='" + searchValue.Text + "'"; }
Т.е. если чекбокс "в найденном" не выделен, прога просто сгенерит новый запрос, в противном случае - новый запрос, в котором даные выделяются из старого
Полный код класса формы
Code
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;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string QUERY;
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dbDataSet.mainData' table. You can move, or remove it, as needed. this.mainDataTableAdapter.Fill(this.dbDataSet.mainData); QUERY = mainDataTableAdapter.SelectCommand; setFieldsList(); }