如何将值从文本文件传递到 DataGrid? C# WPF
How can I pass values from a text file to a DataGrid? C # WPF
我正在用 C# 编写一个简单的程序,使用 wpf,一个 base 的外观,我知道使用 subd 和 entity framework 解决这个问题会更容易,但关键是你需要这样解决
所以,我有一个文本文件,我需要从中将数据加载到日期网格中。
我有一个 class 描述了这个文本文件中的一行,这里是:
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
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);
如果您尝试连接每一列的值,那么您可以使用 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();
}
}
用法:
- 在您的资源中某处引用转换器。我将
Operation
属性 设置为 Multiply
.
<UserControl.Resources>
<converters:MathMultipleConverter x:Key="MathMultipleConverter" Operation="Multiply" />
</UserControl.Resources>
- 在您的 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>
我正在用 C# 编写一个简单的程序,使用 wpf,一个 base 的外观,我知道使用 subd 和 entity framework 解决这个问题会更容易,但关键是你需要这样解决
所以,我有一个文本文件,我需要从中将数据加载到日期网格中。
我有一个 class 描述了这个文本文件中的一行,这里是:
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
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);
如果您尝试连接每一列的值,那么您可以使用 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();
}
}
用法:
- 在您的资源中某处引用转换器。我将
Operation
属性 设置为Multiply
.
<UserControl.Resources>
<converters:MathMultipleConverter x:Key="MathMultipleConverter" Operation="Multiply" />
</UserControl.Resources>
- 在您的 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>