2012-01-26 2 views
1

Я новичок в WPF, и я хотел бы визуализировать данные из SQL-запроса в WPF DataGrid. У меня проблема с как правильно связать данные:Как динамически добавлять данные в WPF DataGrid

SqlCommand cmd = new SqlCommand(sql_dotaz, conn); 
InfoText.Text += ("Příkaz vytvořen a připojen" + "\n"); 

try 
{ 
    conn.Open(); 
    InfoText.Text += ("Připojení otevřeno" + "\n"); 

    SqlDataReader reader = cmd.ExecuteReader(); 

    int row_count = reader.FieldCount; 
    ArrayList propoj = new ArrayList(); 

    for (int i = 0; i < row_count; i++) 
    { 
     propoj.Add(reader.GetName(i)); 
     tabView.Columns.Add(new DataGridTextColumn 
      { 
       Header = reader.GetName(i), 
       Binding = new Binding(reader.GetName(i)) 
      }); 

     //Here is the problem!!! 
     tabView.Items.Add(new {propoj[i] = "Hello"}); 
    } 

Проблема заключается в том, когда пытаются добавить новый элемент, он выдает ошибку. Я не могу явно указать имя заголовка, как это (Invitation = "Hello").

I also tried 

tabView.Columns.Add(new DataGridTextColumn 
    { 
     Header = reader.GetName(i), 
     Binding = new Binding(reader.GetName(i)) 
    }); 

string record = reader.GetName(i)); 
tabView.Items.Add(new {record = "Hello"}); 

Но по-прежнему существует проблема с заголовком - DataGrid пуст.

Пожалуйста, дайте мне знать, если у вас есть идеи. Спасибо большое!

+0

Привет Вилем, добро пожаловать на SO и широкий мир WPF , Как указали пара пользователей, хотя можно добавлять данные непосредственно в элемент управления DataGrid WPF, он неуклюжий, подверженный ошибкам, а не рекомендуемый способ убедиться, что ваши данные отображаются пользователю.Я поддерживаю рекомендации, которые вы ищете для примеров в шаблоне проектирования MVVM, и ознакомьтесь с «Data Binding» a «View» на «ViewModel» – EtherDragon

ответ

0

В решении я нахожу решение. Может быть, это не лучше, но это работает. создать набор данных и SQL Adapter

adapter.Fill(dSet); 
this.DataContext = dSet.Tables[0].DefaultView; 

и в XAML:

<DataGrid Height="Auto" Width="Auto" Name="tabView3" ItemsSource="{Binding}" /> 

А теперь подмигнули работать нормально :-)

0

Вам необходимо управлять этим с помощью DataBinding, так как вы указали технологию WPF как теги.

Пример ссылки:

Link1

Link 2

Link 3

1

Прежде всего, я не думаю, что анонимные типы будут работать в привязке. Вы каким-то образом нужно создать объект-оболочку для этого:

// easiest case 
public class DatabaseObject 
{ 
    public List<string> Items = new List<string>(); 
} 

С этого, вы можете легко создавать столбцы:

// this should be renamed in something like columns or fieldCount... 
int row_count = reader.FieldCount; 

for (int i = 0; i < row_count; i++) 
{ 
    tabView.Columns.Add(new DataGridTextColumn 
     { 
      Header = reader.GetName(i), 
      Binding = new Binding("Items[i]") 
     }); 
} 

И наполнит ваш DataGrid:

if(reader.HasRows) 
{ 
    do 
    { 
     DatabaseObject obj = new DatabaseObject(); 
     for (int i = 0; i < row_count; i++) 
     { 
      obj.Items.Add(reader.GetString(i)); 
     } 

     tabView.Items.Add(obj); 
    } 
    while(reader.NextResult()); 
} 
+0

Спасибо за совет, к сожалению, я все еще не могу связать его, но это из-за моей неопытности. – VilemRousi

0

если хочу пойти простым путем:

  1. заполнить datatable w с вашими данными.
  2. просто свяжите itemssource от datagrid к вашему datatable. (Читайте о DataBinding и MVVM)

    <DataGrid ItemsSource="{Binding MyFilledDataTableProperty}" />

  3. установить правильный DataContext.