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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 03.05.2012, 10:17   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
Репутация: 51
По умолчанию 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, 10:18   #2
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
Репутация: 51
По умолчанию

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

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

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

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

благодарю за совет. я конечно разобрался с тем что создаю экземпляр формы и работаю с именно с экземпляром этой формы (ну как с двойником чтоли), но было бы неплохо обратиться не к экземпляру а напрямую к форме. сделал так убрал
Код:
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, 12:57   #5
=master=
Участник клуба
 
Регистрация: 26.03.2012
Сообщений: 665
Репутация: 54
По умолчанию

Немного не так как писал, но не суть:
Код:
    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, 09:07   #6
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
Репутация: 51
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


07:00.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.