Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 03.05.2012, 09:17   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию DataGridView не отображает данные запроса

Добрый день господа программисты! суть такова: есть класс который служит для соединения программы с sql сервером и различного рода выборок.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data;



namespace Esrn
{
    class ConnectionClass
    {
        public OleDbConnection database;
        frmMain Main = new frmMain();

        public void SQLQuery(string strSQL)
        {
            string queryString = "SELECT * FROM Osn WHERE " + strSQL;
            
            loadDataGrid(queryString);
        }


        #region Загрузка в грид
        public void loadDataGrid(string sqlQueryString)
        {
            try
            {
                
                String connectionString = "User Id=sa;password=15091985;Initial Catalog=Esrn;Data Source=ANDARIEL\\HOST";

                SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlQueryString, connectionString);

                SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);
                Main.bindingSourceMain.DataSource = table;

                Main.dataGridMain.AutoResizeColumns(
                    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
                Main.dataGridMain.DataSource = table;//Main.bindingSourceMain;
                Main.dataGridMain.ReadOnly = true;
                //Main.Show();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion
        

    }
}
есть главная форма frmMain, я нажимаю "запрос по ФИО " открывается форма запроса. Ввожу данные и жму поиск.
Код:
// форма запроса по ФИО
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 Esrn
{
    public partial class frmQueryFIO : Form
    {
        public frmQueryFIO()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked == true)
            {
                dateBorn.Enabled = true;
            }

            if (checkBox1.Checked == false)
            {
                dateBorn.Enabled = false;
            }

        }

        private void btnFind_Click(object sender, EventArgs e)
        {
            
           
            string sFam,sIma,sOt,strSQL="",sDate;
            DateTime dat;

            if (txtFam.Text.Trim() != "")
            {
                sFam = txtFam.Text.Trim().ToUpper();
                strSQL = "Fam = '"+ sFam +"'";
            }

            if (txtIma.Text.Trim() != "")
            {
                sIma = txtIma.Text.Trim().ToUpper();
                if (strSQL == "")
                {
                    strSQL = "Ima = '" + sIma + "'";
                }
                else
                {
                    strSQL = strSQL + " AND Ima = '" + sIma + "'";
                }
                
            }

            if (txtOt.Text.Trim() != "")
            {
                sOt = txtOt.Text.Trim().ToUpper();
                if (strSQL == "")
                {
                    strSQL = "Ot = '" + sOt + "'";
                }
                else
                {
                    strSQL = strSQL + " AND Ot = '" + sOt + "'";
                }
                
            }

            if (checkBox1.Checked == true)
            {
                
                dateBorn.CustomFormat = "MM/dd/yyyy";
                sDate = dateBorn.Text;
                if (strSQL == "")
                {
                    strSQL = " Dr = '" + dateBorn.Text + "'";
                }
                else
                {
                    strSQL = strSQL + " AND Dr = '" + sDate + "'";
                }
            }

            ConnectionClass Conn = new ConnectionClass();
            Conn.SQLQuery(strSQL);
            this.Close();

        }

        private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
        {
            if (checkBox1.Checked == true)
            {
                dateBorn.Enabled = true;
            }
            
            if (checkBox1.Checked == false)
            {
                dateBorn.Enabled = false;
            }

        }
    }
}
wm_leviathan вне форума Ответить с цитированием
Старый 03.05.2012, 09:18   #2
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

данные передаются в класс и класс должен сделать выборку и в dataGridMain отобразить результат запроса. Никаких ошибок не выходит но и данные в гриде не отображаются. долго ломал голову решил в классе дописать Main.Show() и тут открывается 2я такая же главная форма и в ней в гриде отображается нормально результат запроса. Такое ощущение что я создал не экземпляр класса главной формы а как будто новую такую же главную форму. в чем моя ошибка 2 дня голову ломаю не могу понять где ошибся.

P.S. вот такая вот ерунда получается если сделать show http://s1.ipicture.ru/uploads/20120503/3O4EHUZp.gif

Последний раз редактировалось wm_leviathan; 03.05.2012 в 09:30.
wm_leviathan вне форума Ответить с цитированием
Старый 03.05.2012, 09:42   #3
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Такое ощущение что я создал не экземпляр класса главной формы а как будто новую такую же главную форму
Это одно и тоже.
frmMain Main = new frmMain(); - выбросить
класс ConnectionClass либо сделать статиком, либо создать на старте и пользовать всегда один экземпляр
метод loadDataGrid переделать, чтобы он тупо выбирал данные и закачивал в соурс переданный параметром.
Использовать параметризированные запросы.
Использовать биндинг.
=master= вне форума Ответить с цитированием
Старый 03.05.2012, 11:28   #4
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

благодарю за совет. я конечно разобрался с тем что создаю экземпляр формы и работаю с именно с экземпляром этой формы (ну как с двойником чтоли), но было бы неплохо обратиться не к экземпляру а напрямую к форме. сделал так убрал
Код:
frmMain Main = new frmMain();
loadDataGrid допилил до вида
Код:
 try
            {
                
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlQueryString, connectionString);

                SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);

                ((frmMain)Application.OpenForms["frmMain"]).bindingSourceMain.DataSource = table;

                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.AutoResizeColumns(
                    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.DataSource = ((frmMain)Application.OpenForms["frmMain"]).bindingSourceMain;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.ReadOnly = true;
                //Main.Show();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
все работает норм. Соглашусь по наглядности тянет на 2 бала. но всилу того что шарп пользую недавно и после делфи как то тяжеловато идет приходится иметь что есть. если есть лучшие варианты всегда пожалуйста.
Цитата:
класс ConnectionClass либо сделать статиком, либо создать на старте и пользовать всегда один экземпляр
не могли бы вы простенький примерчик привести для большего понимания был бы рад ))
wm_leviathan вне форума Ответить с цитированием
Старый 03.05.2012, 11:57   #5
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Немного не так как писал, но не суть:
Код:
    internal static class ConnectionClass
    {
        public static DataTable SQLQuery(string strSQL)
        {
            string queryString = "SELECT * FROM Osn WHERE " + strSQL;
            
//                String connectionString = "User Id=sa;password=15091985;Initial Catalog=Esrn;Data Source=ANDARIEL\\HOST";
// connectionString держите в конфиге, не гоже ему в коде фигурировать
                String connectionString = ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString;

                SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlQueryString, connectionString);

                //SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); это мусор

                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);
                
                return table;
        }
    }
обработку исключений убрал, этим надо заниматся вызывающему
вызываете так:
Код:
try
{
    bindingSourceMain.DataSource = ConnectionClass.SQLQuery(strSQL);
}
catch (SqlException ex)
{
   MessageBox.Show(ex.Message);
}
=master= вне форума Ответить с цитированием
Старый 04.05.2012, 08:07   #6
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

спасибо большое internal static class еще не доводилось делать, но видать пришло время разбираться. В принципе тут все понятно ))
wm_leviathan вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отчет не отображает данные lionforever C# (си шарп) 7 13.04.2012 13:37
Обновить данные в DataGridView. Как верно? Genco Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 20.04.2011 07:23
DBGrid не отображает данные после добавления k0ks67 БД в Delphi 4 10.12.2009 21:17
function NetUserGetInfo, не правильно отображает данные MStorm Помощь студентам 1 15.01.2008 20:43


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS