Заполнение сетки в C # 3.5 - PullRequest
0 голосов
/ 11 мая 2009

Вчера я установил C # 3.5 и сегодня, когда прочитал тему «Доступ к таблицам Google с помощью C # с помощью API данных Google», и решил попробовать.

Поэтому я решил написать пример, который: 1) получить фид данных первого рабочего листа первой электронной таблицы, имя которого содержит сегмент строки, вставленный пользователем 2) заполнить сетку данными

Ну что ж, я расстался, заполнил 2-мерный массив или списки списка данными о значениях электронной таблицы. Я застрял в поиске элемента управления для размещения данных и его динамической генерации, так как не знаю заранее строк или столбцов таблицы.

Моя интуиция говорит, что я мог бы просто изменить List> с помощью Dataset и начать пробовать разные элементы управления, которые IntelliSense бросает в меня. Я знаю, что сначала я должен прочитать книгу, но я должен был с нетерпением не попробовать ее сначала.

Xaml

<DockPanel Background="LightSteelBlue">

    <!-- Standard input -->
    <DockPanel DockPanel.Dock="Top" Margin="5">
        <TextBlock Margin="10,0,5,0" VerticalAlignment="Center">Username:</TextBlock>
        <TextBox x:Name="username" Width="120" Padding="5,0,5,0" Text="username@gmail.com" />
        <TextBlock Margin="10,0,5,0" VerticalAlignment="Center">Password:</TextBlock>
        <TextBox x:Name="password" Width="120" Padding="5,0,5,0" Text="password" />
        <TextBlock Margin="10,0,5,0" VerticalAlignment="Center">Workbook:</TextBlock>
        <TextBox x:Name="workbookname" Width="120" Padding="5,0,5,0" Text="name" />
        <Button x:Name="getData" Margin="5,0,0,0" Padding="5,0,5,0" Content="Get _Data" Click="getData_Click" />
    </DockPanel>

    <!-- Grid display -->
    <ListBox Name="lb2"/>

</DockPanel>

А с #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Collections;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Spreadsheets;

namespace getGoogleDocsSpreadsheetData
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private bool RunSample(
            String g_username,
            String g_password,
            String g_spreadsheetname
        ){
            SpreadsheetsService service = new SpreadsheetsService("Margus-stackoverflow_example-1");
            service.setUserCredentials(g_username, g_password);
            CellFeed cfeed = null;

            try {
                //get CellFeed of first Worksheet of first Spreadsheet, that contains _spreadsheetname
                cfeed = ((CellFeed)service.Query(new CellQuery(
                    ((WorksheetEntry)(service.Query(new WorksheetQuery(
                        ((SpreadsheetEntry)(
                            from fe in service.Query(new SpreadsheetQuery()).Entries
                            where fe.Title.Text.Contains(g_spreadsheetname)
                            select fe
                        ).First()).Links.FindService(
                            GDataSpreadsheetsNameTable.WorksheetRel,
                            null
                        ).HRef.ToString())).Entries.First())
                    ).Links.FindService(
                        GDataSpreadsheetsNameTable.CellRel,
                        null
                    ).HRef.ToString()))
                );

                /* get data to array
                string[,] values = new string
                    [(from sr in cfeed.Entries select ((CellEntry)sr).Cell.Row).Max()+1
                    ,(from sr in cfeed.Entries select ((CellEntry)sr).Cell.Column).Max()+1];

                foreach (CellEntry curCell in cfeed.Entries)
                    values[curCell.Cell.Row,curCell.Cell.Column] = curCell.Cell.Value;
                 */

                /* get data to list of list of string */
                List<List<string>> lists = new List<List<string>>();

                for (int i = 0; i < 1+ (
                    from sr in cfeed.Entries 
                    select ((CellEntry)sr).Cell.Row).Max(); i++
                ){
                    List<string> x = new List<string>();
                    for (int j = 0; j < 1+ (
                        from sr in cfeed.Entries 
                        select ((CellEntry)sr).Cell.Column).Max(); j++
                    )
                    x.Add(default(string));

                    lists.Add(x);
                }

                foreach (CellEntry curCell in cfeed.Entries)
                    (lists[(int)curCell.Cell.Row])[(int)curCell.Cell.Column] = curCell.Cell.Value;

                //fill datagrid
                this.lb2.ItemsSource = lists;              
            } catch (Exception e){
                System.Console.WriteLine("I exeeded failing!\n" + e.StackTrace);
                return false;
            }

            return true;
        }

        private void getData_Click(object sender, RoutedEventArgs e)
        {
            RunSample(
                this.username.Text,
                this.password.Text,
                this.workbookname.Text);
        }
    }
}

1 Ответ

0 голосов
/ 11 мая 2009

Я использовал это из WPFToolkit:

<my:DataGrid Margin="0,29,0,0" Name="dataGridView" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" AlternatingRowBackground="AliceBlue" ItemsSource="{Binding Path=.}" CanUserResizeRows="False" ClipboardCopyMode="IncludeHeader" IsReadOnly="True" IsTabStop="True" AutoGeneratedColumns="dataGridView_AutoGeneratedColumns" />

С некоторым кодом для его заполнения:

private DataTable dataTable;

public Constructor()
{
    ....
    this.dataTable = new DataTable();

    dataGridView.DataContext = dataTable;
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...