2013-04-15 5 views
0

Я проделал некоторые поиски по этой проблеме, и я нашел несколько основных способов использования DataGrid в WPF. Я все еще изучаю WPF и «привязывающие» данные в целом, поэтому любые советы приветствуются.WPF: Как добавить пользовательские столбцы в DataGrid?

Код, изображенный здесь, является функциональным, но я чувствую, что у меня нет большого контроля над моими данными. Большинство моих опытов с формами окон и datagrids с GridView.

EDIT: Существует некоторая путаница в вопросе моего вопроса. Позвольте мне пояснить: код с комментариями будет создавать пользовательские столбцы. Как программно заполнять эти пользовательские coulmns с данными из моего ObservableCollection. Как я бы здесь:

 foreach (Customer cmr in customerList) 
     { 
      customerGridView.Rows.Add(cmr.customerID, cmr.customerName, cmr.customerArea); 
     } 

Есть ли более простой способ работы с DataGrid, о котором я не знаю?

Вот где я:

namespace WpfApplication1 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    Customer customer = new Customer(); 
    ObservableCollection<Customer> customerList = new ObservableCollection<Customer>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded_1(object sender, RoutedEventArgs e) 
    { 

     //DataGridTextColumn c1 = new DataGridTextColumn(); 
     //c1.Header = "Customer ID"; 
     //c1.Binding = new Binding("CustomerID"); 
     //customerDg.Columns.Add(c1); 

     //DataGridTextColumn c2 = new DataGridTextColumn(); 
     //c2.Header = "Customer Name"; 
     //c2.Binding = new Binding("CustomerName"); 
     //customerDg.Columns.Add(c2); 

     //DataGridTextColumn c3 = new DataGridTextColumn(); 
     //c3.Header = "Customer Area"; 
     //c3.Binding = new Binding("CustomerArea"); 
     //customerDg.Columns.Add(c3); 

     customerList = customer.GetAllCustomers(); 

     customerDg.ItemsSource = customerList; 

     //foreach (Customer cust in customerList) 
     //{ 
     // customerDg.Items.Add(cust); 
     //} 
    } 
} 
} 


namespace WpfApplication1.Data_Layer 
{ 
class Customers 
{ 
    static ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["MSAccess1"]; 
    // Return a list of all products 
    public static ObservableCollection<Customer> GetAllCustomers() 
    { 

     Customer customer; 
     ObservableCollection<Customer> AllCustomers = new ObservableCollection<Customer>(); 
     string p = "SELECT * FROM customer;"; 

     using (OleDbConnection dbConn = new OleDbConnection(settings.ConnectionString)) 
     { 
      try 
      { 
       dbConn.Open(); 

       using (OleDbCommand cmd = dbConn.CreateCommand()) 
       { 
        cmd.CommandText = p; 
        using (OleDbDataReader dbReader = cmd.ExecuteReader()) 
        { 
         // make sure we have 1 or more rows in the data set 
         while (dbReader.Read()) 
         { 
          customer = new Customer(); 
          customer.customerID = Convert.ToInt32(dbReader["CustomerID"]); 
          customer.customerName = dbReader["CustomerName"].ToString(); 
          customer.customerArea = Convert.ToChar(dbReader["CustomerArea"].ToString()); 
          AllCustomers.Add(customer); 
         } 

        } 
       } 
      } 

      catch (Exception ex) 
      { 
       Console.WriteLine("Something went wrong: " + ex); 
      } 

      finally 
      { 
       dbConn.Close(); 
      } 

     } 

     return AllCustomers; 
    } 
} 
} 



namespace WpfApplication1.Business_Layer 
{ 
class Customer 
{ 
    public int customerID { get; set; } 
    public string customerName { get; set; } 
    public char customerArea { get; set; } 


    public Customer() 
    { 
     customerID = 0; 
     customerName = ""; 
     customerArea = 'X'; 
    } 

    public Customer(int customerID, string customerName, char customerArea) 
    { 
     this.customerID = customerID; 
     this.customerName = customerName; 
     this.customerArea = customerArea; 
    } 

    public ObservableCollection<Customer> GetAllCustomers() 
    { 
     return Customers.GetAllCustomers(); 
    } 
} 
} 
<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="305.263" Loaded="Window_Loaded_1"> 
<Grid Margin="0,0,-8,0"> 
    <TextBox x:Name="customerNumberTxt" HorizontalAlignment="Left" Height="23" Margin="163,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
    <TextBox x:Name="customerNameTxt" HorizontalAlignment="Left" Height="23" Margin="163,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
    <TextBox x:Name="customerAreaTxt" HorizontalAlignment="Left" Height="23" Margin="163,66,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
    <Label x:Name="customerNumberLbl" Content="Cutomer number:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.242,-2.146" Width="130"/> 
    <Label x:Name="customerNameLbl" Content="Cutomer name:" HorizontalAlignment="Left" Margin="10,35,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.242,-2.146" Width="130"/> 
    <Label x:Name="customerAreaLbl" Content="Cutomer area:" HorizontalAlignment="Left" Margin="10,63,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.242,-2.146" Width="130"/> 
    <DataGrid x:Name="customerDg" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="10,105,0,0" VerticalAlignment="Top" Height="205" Width="273"> 
     <!--<DataGrid.Columns> 
      <DataGridTextColumn Header="Some header" ></DataGridTextColumn> 
      <DataGridTextColumn Header="Some header 2"></DataGridTextColumn> 
      <DataGridTextColumn Header="Some header 3"></DataGridTextColumn> 
     </DataGrid.Columns>--> 
    </DataGrid> 

</Grid> 
</Window> 
+3

Так что это вопрос? –

+0

Я предполагаю, что вопрос находится в названии, но я не знаю, какова фактическая проблема. Код, который был закомментирован в 'Window_Loaded_1', должен работать. Итак, где же проблема? – anothershrubery

+0

@anothershrubery uncommenting out, что код дает новые заголовки столбцов, которые я не могу заполнить данными. Как заполнить эти столбцы данными из моей наблюдаемой коллекции? Изображение: http://i.imgur.com/SrIFOJX.png –

ответ

2

Не уверен, но это может поможет вам (это добавляет CheckBox, как столбцы):

Использование DataGridTemplateColumn вы можете сделать пользовательские колонны.

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox></CheckBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Это определенно дало мне больше контроля над строк. Можете ли вы прислать мне источник для некоторых чтений о том, как все эти XAML и шаблоны работают? Это очень интересно. –

+0

@ Tunix2 вы можете найти 'DataGridTemplateColumn' –

Смежные вопросы