Я уверен, что большинство людей спрашивают, почему вещи не работают. Я собираюсь все перепутать, спросив, почему это работает.
private SmokeFireDBEntities dbContext = null;
private IList<MemberResponse> gridData = new List<MemberResponse>();
private void UserControl_Initialized(object sender, EventArgs e)
{
this.dbContext = new SmokeFireDBEntities();
var members = from m in dbContext.Members
where new[] { "A", "P", "S", "J" }.Contains(m.Class.ShortName)
orderby m.Line
select m;
foreach (Member m in members)
{
MemberResponse mr = new MemberResponse();
mr.MemberID = m.ID;
mr.Member = m;
this.gridData.Add(mr);
}
PercentageGrid.ItemsSource = this.gridData;
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
AlarmTotal at = new AlarmTotal();
at.Month = Convert.ToByte(this.MonthField.Text);
at.Year = Convert.ToInt16(this.YearField.Text);
at.NumAlarms = Convert.ToInt16(this.TotalAlarmsField.Text);
this.dbContext.AlarmTotals.AddObject(at);
this.dbContext.SaveChanges();
// WHY IS THE FOLLOWING CODE NOT NECESSARY???
//foreach (MemberResponse mr in this.PercentageGrid.Items)
//{
// mr.AlarmTotalID = at.ID;
// this.dbContext.MemberResponses.AddObject(mr);
//}
//this.dbContext.SaveChanges();
}
<UserControl.Resources>
<DataTemplate x:Key="NameColumnTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Member.LastName}" />
<TextBlock Text=", " />
<TextBlock Text="{Binding Path=Member.FirstName}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="InputColumnTemplate">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Path=NumAttended}" Name="MonthResponse" Width="60" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid Background="WhiteSmoke" Height="353" Width="509">
<TextBox Height="23" HorizontalAlignment="Left" Margin="12,33,0,0" Name="MonthField" VerticalAlignment="Top" Width="75" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="93,33,0,0" Name="YearField" VerticalAlignment="Top" Width="59" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="158,33,0,0" Name="TotalAlarmsField" VerticalAlignment="Top" Width="115" />
<ListView Margin="1,67,0,0" Name="PercentageGrid" ItemsSource="Binding" HorizontalAlignment="Stretch" Width="507" Height="286" VerticalAlignment="Stretch">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Name" CellTemplate="{StaticResource NameColumnTemplate}" />
<GridViewColumn Header="Line#" DisplayMemberBinding="{Binding Path=Member.Line}" />
<GridViewColumn Header="Class" DisplayMemberBinding="{Binding Path=Member.Class.ShortName}" />
<GridViewColumn Header="Response" CellTemplate="{StaticResource InputColumnTemplate}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
Я удалил ненужный код, чтобы немного его сократить. Я совершенно новичок в C #, .NET и все, что с этим связано. Я полностью озадачен тем, почему это работает вообще. Когда я вызываю первый dbContext.SaveChanges (), чтобы сохранить запись в «AlarmTotals», он также сохраняет все записи «MemberResponse» одновременно и, что еще более удивительно, заполняет правильное поле AlarmTotals.ID. Это действительно отталкивает меня, я просто не могу понять, как это работает, по-видимому, по волшебству.
Любое понимание и объяснение будет с благодарностью. Я действительно хочу понять, что здесь происходит.