动态修改列DataGrid

时间:2012-07-09 19:08:26

标签: c# .net wpf datagrid

如果我没有正确使用某些东西,请原谅我。我已经习惯了Java,但我正在努力遵守C#惯例!

我在为DataGrid中的列动态设置数据时遇到问题。我成功添加了列动态设置列标题,但我似乎无法设置数据。这是结果: A data grid without rows

正在读取数据,而columnData包含正确的值,正如记录器告诉我的那样。 (我没有使用Debug类,因为我正在一台没有Visual C#的机器上进行测试。)

我认为,我的DataGrid类是问题所在。而且,我认为问题在于我如何使用绑定(我还没有很好地掌握如何操作),

这是我的班级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;

namespace mdr
{
    class MDRResult : System.Windows.Controls.DataGrid
    {
        private string[] headers;

        private string[][] fields;

        public MDRResult(string[] headers, string[][] fields) : base()
        {

            int columnNumber = 0;
            foreach (string s in headers)
            {
                System.Windows.Controls.DataGridTextColumn column = new System.Windows.Controls.DataGridTextColumn();
                column.Header = s;
                string[] columnData = new string[fields.Length];
                int rowNumber = 0;
                foreach (string[] row in fields)
                {
                    columnData[rowNumber] = row[columnNumber];
                    rowNumber++;
                }
                SurfaceWindow1.logger.WriteLine("Adding column " + s + " with data ");
                foreach (string str in columnData)
                    SurfaceWindow1.logger.WriteLine("\t" + str);
                Binding b = new Binding();
                //b.Mode = BindingMode.OneTime;
                b.Source = columnData;
                column.Binding = b;
                Columns.Add(column);
                columnNumber++;
            }

        }
    }
}

我的XAML与另一个班级配对。这是XAML:

<s:SurfaceWindow x:Class="mdr.SurfaceWindow1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:s="http://schemas.microsoft.com/surface/2008"
    Title="SurfaceApplication1" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Grid Background="#FFC7C7C7">
        <s:ScatterView HorizontalAlignment="Left" Margin="248,1,0,0" Name="resultsView" VerticalAlignment="Top" Background="#FFDBDBDB" Grid.RowSpan="2">
        </s:ScatterView>
        <Grid HorizontalAlignment="Left" Width="270">
            <Grid.RowDefinitions>
                <RowDefinition Height="274*" />
                <RowDefinition Height="307*" />
            </Grid.RowDefinitions>
            <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0, 20, 0, 0">
                <s:SurfaceTextBox Height="37" HorizontalAlignment="Right" Margin="70,0,0,0" Name="fileLocation" VerticalAlignment="Center" Width="173" Background="White" Foreground="Black" BorderBrush="Black" VerticalContentAlignment="Center" Text="http://endeavour.dartmouth.edu/eva/MDR-SampleData.txt" />
                <Label Content="File:" Height="10" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0,0,0" Name="FileLabel" Width="50" Foreground="Black" />
            </Grid>
            <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0, 70, 0, 0">
                <s:SurfaceTextBox Height="37" HorizontalAlignment="Right" Margin="70,0,0,0" Name="cv" VerticalAlignment="Center" Width="173" Background="White" Foreground="Black" BorderBrush="Black" VerticalContentAlignment="Center" Text="10" />
                <Label Content="CV:" Height="10" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0,0,0" Name="CVLabel" Width="50" Foreground="Black" />
            </Grid>
        </Grid>
        <Grid Height="400" Margin="0, 120, 0, 0" HorizontalAlignment="Left" Width="270">
            <s:SurfaceSlider ValueChanged="minSlider_ValueChanged" Grid.Row="1" Height="300" HorizontalAlignment="Left" Margin="62,6,0,0" Name="minSlider" VerticalAlignment="Top" Width="27" Orientation="Vertical" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Minimum="1" />
            <s:SurfaceSlider ValueChanged="maxSlider_ValueChanged" Height="300" HorizontalAlignment="Right" Margin="0,6,46,0" Name="maxSlider" VerticalAlignment="Top" Width="27" Grid.Row="1" IsDirectionReversed="False" Orientation="Vertical" Value="1" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Minimum="1" />
            <Label Content="Min: 1" Height="26" HorizontalAlignment="Left" Margin="1,133,0,0" Name="minLabel" VerticalAlignment="Top" Width="77" Foreground="Black" />
            <Label Content="Max: 1" Height="26" HorizontalAlignment="Left" Margin="103,133,0,0" Name="maxLabel" VerticalAlignment="Top" Width="88" Foreground="Black" />
            <Label Content="Level" Grid.Row="1" Height="17" HorizontalAlignment="Center" Margin="0,0,0,0" Name="label3" VerticalAlignment="Top" Width="60" Foreground="Black" />
        </Grid>
        <s:SurfaceButton Click="onMDRSubmit" Content="Run" Height="50" HorizontalAlignment="Left" Margin="40,0,0,40" Name="runButton" VerticalAlignment="Bottom" Width="172" FontSize="32" BorderBrush="Black" Grid.Row="1" Background="#FF9A9A9A" HorizontalContentAlignment="Center" />
    </Grid>
</s:SurfaceWindow>

这是班级:

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 Microsoft.Surface;
using Microsoft.Surface.Presentation;
using Microsoft.Surface.Presentation.Controls;
using Microsoft.Surface.Presentation.Input;
using System.IO;
using System.Diagnostics;
using System.Data;
using System.Collections;

namespace mdr
{
    /// <summary>
    /// Interaction logic for SurfaceWindow1.xaml
    /// </summary>
    public partial class SurfaceWindow1 : SurfaceWindow
    {
        /// <summary>
        /// Default constructor.
        /// </summary>
        /// 
        MDRInterface mdr;
        public static StreamWriter logger;
        public static String directory;
        public SurfaceWindow1()
        {
            InitializeComponent();

            // Add handlers for window availability events
            AddWindowAvailabilityHandlers();
        }

        /// <summary>
        /// Occurs when the window is about to close. 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            // Remove handlers for window availability events
            RemoveWindowAvailabilityHandlers();
        }

        /// <summary>
        /// Adds handlers for window availability events.
        /// </summary>
        private void AddWindowAvailabilityHandlers()
        {
            // Subscribe to surface window availability events
            ApplicationServices.WindowInteractive += OnWindowInteractive;
            ApplicationServices.WindowNoninteractive += OnWindowNoninteractive;
            ApplicationServices.WindowUnavailable += OnWindowUnavailable;
        }

        /// <summary>
        /// Removes handlers for window availability events.
        /// </summary>
        private void RemoveWindowAvailabilityHandlers()
        {
            // Unsubscribe from surface window availability events
            ApplicationServices.WindowInteractive -= OnWindowInteractive;
            ApplicationServices.WindowNoninteractive -= OnWindowNoninteractive;
            ApplicationServices.WindowUnavailable -= OnWindowUnavailable;
        }

        /// <summary>
        /// This is called when the user can interact with the application's window.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnWindowInteractive(object sender, EventArgs e)
        {
            //TODO: enable audio, animations here
        }

        /// <summary>
        /// This is called when the user can see but not interact with the application's window.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnWindowNoninteractive(object sender, EventArgs e)
        {
            //TODO: Disable audio here if it is enabled

            //TODO: optionally enable animations here
        }

        /// <summary>
        /// This is called when the application's window is not visible or interactive.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnWindowUnavailable(object sender, EventArgs e)
        {
            //TODO: disable audio, animations here
        }

        private void AddMDRResult(string result)
        {
            DataTable table = new DataTable();
            string[] rows = result.Split('\n');
            foreach (string s in rows[0].Split('\t'))
            {
                if (s.Length == 0) continue;
                logger.WriteLine("Adding header " + s);
                table.Columns.Add(s);
            }

            bool first = true;
            foreach (string s in rows)
            {
                if (first)
                {
                    first = false;
                    continue;
                }
                DataRow row = table.NewRow();
                int i = 0;
                logger.WriteLine("Row " + table.Rows.Count + ": ");
                foreach (string value in s.Split('\t'))
                {
                    if (value.Length == 0)
                        continue;
                    logger.WriteLine("\t element " + i + ": " + value);
                    row[i] = value;
                    i++;
                }
                for (i = 0; i < table.Columns.Count; i++)
                    logger.Write(row[i] + "\t");

                logger.WriteLine();
                table.Rows.Add(row);
            }

            DataView view = table.AsDataView();

            ScatterViewItem item = new ScatterViewItem();
            ArrayList headersList = new ArrayList();
            foreach (string s in rows[0].Split('\t'))
            {
                if (s.Length == 0) continue;
                headersList.Add(s);
            }

            object[] list = headersList.ToArray();
            string[] headers = new string[list.Length];

            for(int i = 0; i < headers.Length; i++)
                headers[i] = list[i].ToString();

            ArrayList fieldList = new ArrayList();
            first = true;
            foreach (string s in rows)
            {
                if (first) {first = false; continue;}
                int i = 0;
                string[] row = new string[headers.Length];
                foreach (string value in s.Split('\t'))
                {
                    if (value.Length == 0)
                        continue;
                    row[i] = value;
                    i++;
                }
                fieldList.Add(row);
            }

            list = fieldList.ToArray();
            string[][] fields = new string[list.Length][];

            for(int i = 0; i < list.Length; i++)
                fields[i] = (string[])(list[i]);

            item.Content = new MDRResult(headers, fields);

            item.Width = 500;
            item.Height = 500;

            resultsView.Items.Add(item);
        }

        private void onMDRSubmit(object sender, RoutedEventArgs args)
        {
            if (logger == null)
            {
                directory = Directory.GetCurrentDirectory();
                if (directory[directory.Length - 1] == '\\')
                    directory = directory.Substring(0, directory.Length - 1);
                String logFile = directory + "\\log\\surface.txt";
                Debug.WriteLine("Creating log file: " + logFile);
                if (File.Exists(logFile))
                    File.Delete(logFile);
                Directory.CreateDirectory("\\log\\");
                FileStream stream = File.Create(logFile);
                logger = new StreamWriter(stream);
                logger.AutoFlush = true;
            }
            if (mdr == null)
            {
                logger.WriteLine("Initializing MDR wrapper...");
                mdr = new MDRInterface();
                logger.WriteLine("Initialized MDR wrapper!");
            }
            logger.WriteLine("Starting MDR...");
            string text = cv.Text;
            string result = mdr.RunMDR(int.Parse(text), (int)minSlider.Value, (int)maxSlider.Value, (long)0, fileLocation.Text);
            logger.WriteLine("Finished MDR! Adding to results list.");
            AddMDRResult(result);
        }

        private void minSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            try
            {
                if (e.NewValue > maxSlider.Value)
                    minSlider.Value = e.OldValue;
                minLabel.Content = "Min: " + minSlider.Value;
            }
            catch (NullReferenceException ex)
            {
                //ignore
            }
        }

        private void maxSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            try
            {
                if (e.NewValue < minSlider.Value)
                    maxSlider.Value = e.OldValue;
                maxLabel.Content = "Max: " + maxSlider.Value;
            }
            catch (NullReferenceException ex)
            {
                //ignore
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

试试这样:

class MDRResult : DataGrid
{
    public MDRResult(string[] headers, string[][] fields)
        : base()
    {
        for (int i = 0; i < headers.Length; ++i)
            this.Columns.Add(new DataGridTextColumn()
            {
                Header = headers[i],
                Binding = new Binding("[" + i + "]")
            });
        this.AutoGenerateColumns = false;
        this.ItemsSource = fields;
    }
}