Here Вопрос, аналогичный моему вопросу, задан, но я не нашел решение там.DataGridComboBoxColumn разные ItemsSource для разных строк
Мой вопрос: Как связать разные данные (например, списки) с «DataGridComboBoxColumn» для каждого ComboBox в разных строках. Вот код, который я попытался
XAML:
<Grid>
<DataGrid x:Name="dg_TimeTable" AutoGenerateColumns="False" Margin="0,0,0,97" ColumnWidth="*">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding CLASS}" Header="CLASS" />
<DataGridComboBoxColumn Header="PERIOD" x:Name="gPeriods" SelectedValueBinding="{Binding PERIOD, Mode=TwoWay}" DisplayMemberPath="{Binding PERIOD}" />
<DataGridComboBoxColumn Header="TEACHERS" x:Name="gTeachers" SelectedValueBinding="{Binding TEACHER, Mode=TwoWay}" DisplayMemberPath="{Binding TEACHER}" />
<DataGridComboBoxColumn Header="SUBJECTS" x:Name="gSubjects" SelectedValueBinding="{Binding SUBJECT, Mode=TwoWay}" DisplayMemberPath="{Binding SUBJECT}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
.cs
using System.Collections.ObjectModel; // For ObservableCollection
public partial class MainWindow : Window
{
ObservableCollection<string> listTeachersSix = null;
ObservableCollection<string> listTeachersSeven = null;
ObservableCollection<string> listTeachersEight = null;
ObservableCollection<string> listTeachersNine = null;
ObservableCollection<string> listTeachersTen = null;
ObservableCollection<string> listSubjects = null;
ObservableCollection<int> listPeriods = null;
public MainWindow()
{
InitializeComponent();
listTeachersSix = new ObservableCollection<string>();
listTeachersSeven = new ObservableCollection<string>();
listTeachersEight = new ObservableCollection<string>();
listTeachersNine = new ObservableCollection<string>();
listTeachersTen = new ObservableCollection<string>();
listSubjects = new ObservableCollection<string>();
listPeriods = new ObservableCollection<int>();
listTeachersSix.Add("Vijay");
listTeachersSix.Add("Naveen");
listTeachersSix.Add("Gopal");
listTeachersSix.Add("Somesh");
listTeachersSeven.Add("Raj");
listTeachersSeven.Add("Rama Krishna");
listTeachersSeven.Add("Rakesh");
listTeachersSeven.Add("Ram Babu");
listTeachersEight.Add("Murali");
listTeachersEight.Add("Ritesh");
listTeachersEight.Add("Nagesh");
listTeachersEight.Add("Tarun");
listTeachersNine.Add("Bhaskar");
listTeachersNine.Add("Babji");
listTeachersNine.Add("Bhanu");
listTeachersNine.Add("Balaji");
listTeachersTen.Add("Lal");
listTeachersTen.Add("Mohan");
listTeachersTen.Add("Raj Sekhar");
listTeachersTen.Add("Sunil");
for (int i = 0; i <= 8; i++)
listPeriods.Add(i);
listSubjects.Add("Maths");
listSubjects.Add("Physics");
listSubjects.Add("Social");
listSubjects.Add("English");
listSubjects.Add("Hindi");
listSubjects.Add("Telugu");
List<Info> listTimeTable = new List<Info>()
{
new Info() { CLASS="6", PERIOD=1, TEACHER="Vijay", SUBJECT="Maths" },
new Info() { CLASS="7", PERIOD=5, TEACHER="Raj", SUBJECT="Physics" },
new Info() { CLASS="8", PERIOD=7, TEACHER="Murali", SUBJECT="Social" },
new Info() { CLASS="10", PERIOD=4, TEACHER="Mohan", SUBJECT="English" },
new Info() { CLASS="6", PERIOD=8, TEACHER="Naveen", SUBJECT="Maths" },
new Info() { CLASS="9", PERIOD=3, TEACHER="Bhaskar", SUBJECT="Hindi" },
new Info() { CLASS="8", PERIOD=6, TEACHER="Ritesh", SUBJECT="English" },
new Info() { CLASS="10", PERIOD=2, TEACHER="Lal", SUBJECT="Social" }
};
dg_TimeTable.ItemsSource = listTimeTable;
gPeriods.ItemsSource = listPeriods;
gSubjects.ItemsSource = listSubjects;
gTeachers.ItemsSource = listTeachersSix;
}
}
public class Info
{
public string CLASS { get; set; }
public int PERIOD { get; set; }
public string SUBJECT { get; set; }
public string TEACHER { get; set; }
}
, когда я запускаю этот код, выход, как показано ниже.
Как вы видите в моем коде есть разные учителя для разных классов. Когда я нажимаю на сказать 9-го класса,
"listTeachersNine" должны быть добавлены к "gTeachers.ItemsSource". Но если я это сделаю
gTeachers.ItemsSource = listTeachersNine;
все остальные строки действуют. Как я могу сделать это без изменений в других строках. Пожалуйста, дайте мне некоторое представление ... Спасибо заранее
UPDATE:
Даже если я попробовал это ниже код
private void dg_TimeTable_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int num = (sender as DataGrid).SelectedIndex;
try
{
if (num == 0)
{
//listTeachersSix.Clear();
//listTeachersSix.Add("Vijay");
//listTeachersSix.Add("Naveen");
//listTeachersSix.Add("Gopal");
//listTeachersSix.Add("Somesh");
gTeachers.ItemsSource = listTeachersSix;
}
else if (num == 1)
{
//listTeachersSix.Clear();
//listTeachersSix.Add("Raj");
//listTeachersSix.Add("Rama Krishna");
//listTeachersSix.Add("Rakesh");
//listTeachersSix.Add("Ram Babu");
gTeachers.ItemsSource = listTeachersSeven;
}
else if (num == 2)
{
//listTeachersSix.Clear();
//listTeachersSix.Add("Murali");
//listTeachersSix.Add("Ritesh");
//listTeachersSix.Add("Nagesh");
//listTeachersSix.Add("Tarun");
gTeachers.ItemsSource = listTeachersEight;
}
}
Я попытался как комментировал часть и раскомментируйте часть, но не использовать его. Когда я запускаю свое приложение, он показывает, как показано выше на первой диаграмме. Но при нажатии на определенную строку все остальные данные строк исчезают. Но дело в том, что он обновляет данные новых учителей. Посмотрите ниже две фотографии.
Так, не меняя остальные строки можно обновить строку, я хотел .....
Второе решение довольно хорошее и простое. В ближайшее время я попробую его обновить. Спасибо :) – Gopi
См. Мой обновленный вопрос. – Gopi
@Gopi 'gTeachers' является' DataGridComboBoxColumn', поэтому установка 'ItemsSource' применяется ко всем строкам. Вы только хотите установить «ItemsSource» для выбранной строки. Я бы предложил конвертер, как я написал в своем ответе. Возможно, вы сможете написать код, чтобы найти «ComboBox» в выбранной строке, чтобы изменить это, но было бы сложнее, на мой взгляд. – Rachel