【问题标题】:How can I pass values ​from a text file to a DataGrid? C # WPF如何将值从文本文件传递到 DataGrid? C#WPF
【发布时间】:2021-02-27 19:05:49
【问题描述】:

我正在使用wpf在C#中编写一个简单的程序,类似于base,我知道使用subd和实体框架解决这个问题会更容易,但重点是你需要这样解决

所以,我有一个文本文件,我需要从中将数据加载到日期网格中。

我有一个类描述了这个文本文件中的一行,这里是:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public string MidName { get; set; }
    public int Informatics { get; set; }
    public int Maths { get; set; }
    public int Physics { get; set; }
    public double Score { get; set; }
}

分数字段,用于来自程序的数据(学生成绩的算术平均值)

我有一个数据网格,我需要在其中输出数据:

<DataGrid x:Name="DGridStudents" IsReadOnly="True" AutoGenerateColumns="False" HorizontalAlignment="Left" Height="329" Margin="57,15,0,0" VerticalAlignment="Top" Width="736">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Width="*" Binding="{Binding Id}"/>
            <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="LastName" Width="*" Binding="{Binding LastName}"/>
            <DataGridTextColumn Header="MidName" Width="*" Binding="{Binding MidName}"/>
            <DataGridTextColumn Header="Informatics" Width="*" Binding="{Binding Informatics}"/>
            <DataGridTextColumn Header="Maths" Width="*" Binding="{Binding Maths}"/>
            <DataGridTextColumn Header="Physics" Width="*" Binding="{Binding Physics}"/>
            <DataGridTextColumn Header="Score" Width="*" Binding="{Binding Score}"/>
        </DataGrid.Columns>
    </DataGrid>

因此,我以前填写 DataGrid,现在我需要添加 Score 字段(科目成绩的算术平均值)

List<Student> list = new List<Student>();
            using (StreamReader sr = new StreamReader(fileName, true))
            {
                
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    var parsed = line.Split(' ');
                    list.Add(new Student
                        (
                           Convert.ToInt32(parsed[0]),
                           parsed[1],
                           parsed[2],
                           parsed[3],
                           Convert.ToInt32(parsed[4]),
                           Convert.ToInt32(parsed[5]),
                           Convert.ToInt32(parsed[6])
                        ));
                }
            }
            DGridStudents.ItemsSource = list;

请告诉我如何在不使用 MVVM 模式的情况下使用数据绑定来做到这一点?

文本文件中的一行示例:

1 本尼迪克特蒂莫西-卡尔顿康伯巴奇 5 5 5

【问题讨论】:

  • 你要问的是如何计算三个整数的算术平均值?将它们相加并将结果除以三。
  • XD,不,我在问如何将数据输出到日期网格,以便可以通过绑定 @Clemens 完成
  • 不绑定到 Score,而是使用 MultiBinding 到其他三个属性,并使用 Binding Converter 计算所需值。否则只计算 Student 构造函数中的值。

标签: c# wpf datagrid txt


【解决方案1】:

如果您尝试连接每列的值,则可以使用MultiBinding

这是一个例子:

<DataGridTextColumn Header="Your Header">
    <DataGridTextColumn.Binding>
                        
        <!-- 
            Your string format here.
            This will put a space between each value.
        -->
        <MultiBinding StringFormat="{}{0} {1} {2} {3} {4} {5} {6} {7}">

            <!-- Your bindings... -->
            <MultiBinding.Bindings>
                <Binding Path="Id" />
                <Binding Path="Name" />
                <Binding Path="LastName" />
                <Binding Path="MidName" />
                <Binding Path="Informatics" />
                <Binding Path="Maths" />
                <Binding Path="Physics" />
                <Binding Path="Score" />
            </MultiBinding.Bindings>
        </MultiBinding>
    </DataGridTextColumn.Binding>

</DataGridTextColumn>

编辑:

我想我误解了你的文本文件中的那一行。 如果你想执行某种计算,你可以创建一个转换器。

这是一个数学转换器示例,它有一个名为 Operation 的属性来确定要做什么。

  • 此转换器旨在仅对 2 个值执行数学运算 - 您必须编写代码以满足您的需要。
public sealed class MathMultipleConverter : IMultiValueConverter
{
    #region Converter Properties
        
    public MathOperation Operation { get; set; }

    #endregion

    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        //  Do you calculations here...

        if (value == null || value.Length < 2 || 
            value[0] == null || value[1] == null) 
            return Binding.DoNothing;

        if (!double.TryParse(value[0].ToString(), out double value1) || 
            !double.TryParse(value[1].ToString(), out double value2))
            return 0;

        switch (Operation)
        {
            default:
                return value1 + value2;
            case MathOperation.Divide:
                return value1 / value2;
            case MathOperation.Multiply:
                return value1 * value2;
            case MathOperation.Subtract:
                return value1 - value2;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用法:

  1. 在您的资源中某处引用转换器。我将Operation 属性设置为Multiply
<UserControl.Resources>
        <converters:MathMultipleConverter x:Key="MathMultipleConverter" Operation="Multiply" />
</UserControl.Resources>
  1. 在您的 MultiBinding 中使用它。
<DataGridTextColumn Header="Your Header">
    <DataGridTextColumn.Binding>

        <!-- Your Converter -->
        <MultiBinding Converter="{StaticResource MathMultipleConverter}">

            <!-- Your bindings... -->
            <MultiBinding.Bindings>
                <Binding Path="Maths" />
                <Binding Path="Physics" />
            </MultiBinding.Bindings>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

【讨论】:

  • 我忘了提到,如果您打算进行某种计算,那么您可以创建一个转换器并多重绑定到该转换器而不是 StringFormat。
【解决方案2】:
var student = new Student
                        {
                            Id = Convert.ToInt32(parsed[0]),
                            Name = parsed[1],
                            LastName = parsed[2],
                            MidName = parsed[3],
                            Informatika = Convert.ToInt32(parsed[4]),
                            Matematika = Convert.ToInt32(parsed[5]),
                            Fizika = Convert.ToInt32(parsed[6]),
                            Score = 5
                        };
                        list.Add(student);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多