none
Привязка DataGrid к данным из MSSQL Express RRS feed

  • Вопрос

  • Здравствуйте ещё раз. Такая проблема: нужно отобразить содержание таблицы в БД на элементе DataGrid, но почитав MSDN я так и не понял как этой таблицей пользоваться (Visual C# 2010 Express, в источники данных MSSQL Express не добавляется).

    К серверу MSSQL подключаюсь таким образом:

    private void Connect_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                XDocument sn = XDocument.Load("config.xml");
                string server = (string) sn.Root.Element("AdminPanel").Element("Server_Address");
                string data = (string) sn.Root.Element("AdminPanel").Element("DataBase_Name");
                string login = (string) sn.Root.Element("AdminPanel").Element("MSSQL_Login");
                string password = (string) sn.Root.Element("AdminPanel").Element("MSSQL_Password");
                DataContext db = new DataContext("Persist Security Info=False;User ID=" + login + ";Password=" + password + ";Initial Catalog=" + data + ";Data Source=\"" + server + "\"");
    
    
                if (db.DatabaseExists())
                    MessageBox.Show("Подключение выполнено успешно!", "^_^");
                else
                    MessageBox.Show("Не могу подключится...", ":-(");
            }
    

    Имя базы - HellDB, логин с паролем вытаскиваются из XML. Поключение нормально работает. В базе есть таблица test, в ней две колонки:

    number и test_data. На элементе DataGrid созданы два столбца: num и data соответственно. Как можно по наступлении события Connect_Click() поместить данные их базы данных в DataGrid? Зараннее благодарю за ответ.


    MSDN AA User
    • Перемещено Abolmasov Dmitry 6 февраля 2012 г. 11:04 (От:Языки программирования)
    17 января 2012 г. 21:03

Ответы

  • > Table<dataModify> test = db.GetTable<dataModify>(); //что сюда написать чтобы вывести столбцы num и //value в DataGrid с именем Data?
     
      
    this.Data.DataContext = test.ToList();
    
     
    в xaml должен быть тег, например, такой:
     
    <DataGrid ItemsSource="{Binding}" Name="Data" ColumnWidth="*" />
    
     
     


    • Изменено Malobukv 18 января 2012 г. 16:10
    • Помечено в качестве ответа asdfxcbneftyherwe 18 января 2012 г. 16:15
    18 января 2012 г. 16:08
  • > как добиться аналогичного эффекта, используя окно свойств элемента?
     
     
    в xaml в ресурсах должен быть ObjectDataProvider и т.д. чтобы wpf-редактор знал как получить данные.
    ниже пример для подключения к базе данных "TESTDB".
     
    <Window x:Class="WpfApplication3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="300" Width="300"
            xmlns:app ="clr-namespace:WpfApplication3"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:linq="clr-namespace:System.Data.Linq;assembly=System.Data.Linq">
        <Window.Resources>
            <ObjectDataProvider x:Key="_dc" ObjectType="{x:Type linq:DataContext}">
                <ObjectDataProvider.ConstructorParameters>
                    <sys:String>Server=.\SQLEXPRESS;Database=TESTDB;Integrated Security=SSPI</sys:String>
                </ObjectDataProvider.ConstructorParameters>
            </ObjectDataProvider>
            <ObjectDataProvider x:Key="_dt" ObjectInstance="{StaticResource _dc}" MethodName="GetTable">
                <ObjectDataProvider.MethodParameters>
                    <x:Type Type="app:dataModify"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
        </Window.Resources>
        <Grid>
            <DataGrid ItemsSource="{Binding}" Name="Data" ColumnWidth="*"  
                    DataContext="{Binding Source={StaticResource _dt}}" />
        </Grid>
    </Window>
    
    
    using System.Data.Linq.Mapping;
    using System.Windows;
    
    namespace WpfApplication3
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
        }
    
        [Table(Name = "test")]
        public class dataModify
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true)]
            public int num { get; set; }
            [Column]
            public string value { get; set; }
        }
    }
    
    
      
      
    • Помечено в качестве ответа asdfxcbneftyherwe 18 января 2012 г. 17:15
    18 января 2012 г. 17:08

Все ответы

  • > нужно отобразить содержание таблицы в БД [...] есть таблица test, в ней две колонки: number и test_data. [...] по наступлении события Connect_Click() поместить данные их базы данных в DataGrid
     
     
    для работы DataContext надо определить соответствующий класс, который будет заполняться данными.
    но можно загрузить данные в таблицу и привязать к DataGrid.
     
     
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var c = new SqlConnection("Server=.\\SQLEXPRESS;Database=TestData;Integrated Security=SSPI");
                var cmd = c.CreateCommand();
                cmd.CommandText = "select * from [items]";
                c.Open();
                using (var r = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    var dt = new DataTable();
                    dt.Load(r);
                    new DataGrid { Parent = this, Dock = DockStyle.Fill, DataSource = dt };
                }
            }
        }
    }
    
        
       

    • Изменено Malobukv 17 января 2012 г. 23:02
    • Предложено в качестве ответа Alexandr Gashper 18 января 2012 г. 4:25
    • Помечено в качестве ответа asdfxcbneftyherwe 18 января 2012 г. 6:10
    • Снята пометка об ответе asdfxcbneftyherwe 18 января 2012 г. 15:11
    17 января 2012 г. 22:51
  • Почти понятно. Сделал класс сущностей, который заполняется из базы. Ах, да, чуть не забыл: если важно, то это всё делается на WPF. Есть вот этот обработчик:

     

    private void Connect_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                 //коннектимся
                using (DataContext db = new DataContext("Persist Security Info=False;User ID=" + login + ";Password=" + password + ";Initial Catalog=" + data + ";Data Source=\"" + server + "\""))
                {
                    Table<dataModify> test = db.GetTable<dataModify>();
                    //что сюда написать чтобы вывести столбцы num и 
                    //value в DataGrid с именем Data?
                }
            }
    

    класс сущностей (какое всё таки весёлое название :-) ):

     

     

    namespace Hell_Library
    {
        [Table(Name = "test")]
        public class dataModify
        {
            private int _num;
            [Column(IsPrimaryKey = true, Storage = "_num")]
            public int num
            {
                get { return this._num; }
                set { this._num = value; }
            }
    
            private string _value;
            [Column(Storage = "_value")]
            public string value
            {
                get { return this._value; }
                set { this._value = value; }
            }
        }
    }
    

     


    MSDN AA User
    18 января 2012 г. 15:19
  • > Table<dataModify> test = db.GetTable<dataModify>(); //что сюда написать чтобы вывести столбцы num и //value в DataGrid с именем Data?
     
      
    this.Data.DataContext = test.ToList();
    
     
    в xaml должен быть тег, например, такой:
     
    <DataGrid ItemsSource="{Binding}" Name="Data" ColumnWidth="*" />
    
     
     


    • Изменено Malobukv 18 января 2012 г. 16:10
    • Помечено в качестве ответа asdfxcbneftyherwe 18 января 2012 г. 16:15
    18 января 2012 г. 16:08
  • И последний вопрос: как добиться аналогичного эффекта, используя окно свойств элемента? Выделяю DataGrid, тыкаю в DataSource, а куда лезть дальше? Visual C# 2010 Express.


    MSDN AA User
    18 января 2012 г. 16:19
  • > как добиться аналогичного эффекта, используя окно свойств элемента?
     
     
    в xaml в ресурсах должен быть ObjectDataProvider и т.д. чтобы wpf-редактор знал как получить данные.
    ниже пример для подключения к базе данных "TESTDB".
     
    <Window x:Class="WpfApplication3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="300" Width="300"
            xmlns:app ="clr-namespace:WpfApplication3"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:linq="clr-namespace:System.Data.Linq;assembly=System.Data.Linq">
        <Window.Resources>
            <ObjectDataProvider x:Key="_dc" ObjectType="{x:Type linq:DataContext}">
                <ObjectDataProvider.ConstructorParameters>
                    <sys:String>Server=.\SQLEXPRESS;Database=TESTDB;Integrated Security=SSPI</sys:String>
                </ObjectDataProvider.ConstructorParameters>
            </ObjectDataProvider>
            <ObjectDataProvider x:Key="_dt" ObjectInstance="{StaticResource _dc}" MethodName="GetTable">
                <ObjectDataProvider.MethodParameters>
                    <x:Type Type="app:dataModify"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
        </Window.Resources>
        <Grid>
            <DataGrid ItemsSource="{Binding}" Name="Data" ColumnWidth="*"  
                    DataContext="{Binding Source={StaticResource _dt}}" />
        </Grid>
    </Window>
    
    
    using System.Data.Linq.Mapping;
    using System.Windows;
    
    namespace WpfApplication3
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
        }
    
        [Table(Name = "test")]
        public class dataModify
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true)]
            public int num { get; set; }
            [Column]
            public string value { get; set; }
        }
    }
    
    
      
      
    • Помечено в качестве ответа asdfxcbneftyherwe 18 января 2012 г. 17:15
    18 января 2012 г. 17:08