从 1 table 绑定 DataGridComboBoxColumn,从另一个 table 选择值
Binding DataGridComboBoxColumn from 1 table, selected value from another table
我无法在数据网格上绑定 DataGridComboBoxColumn。简而言之,我想做的是,我在数据网格上有 3 行,第一行(DataGridTextColumn)显示 Table1 中的 GrupName,第二行(DataGridComboBoxColumn)显示 Table2 中的 PrinterNames,但是从 Table1 中选择的值(PrinterID),第三行(DataGridComboBoxColumn)显示 TaxRates从表 3 中,从表 1 中选择值
因此数据网格将显示为;
Group Name Printer Name Tax Rate
--------------------------------------------
Pizza Pizza Printer 8
Salad Salad Printer 8
Beverage No Printer 8
Table 1 Table 2 Table3
-------- --------------- ----------
id id id
GroupName PrinterName TaxRate
PrinterID
TaxID
打印机名称和税率将成为 DataGridComboBoxColumn。我计划使用 ObservableCollection,因此当用户通过从 DataGridComboBoxColumn 中选择将 "Printer" 更改为 "Pizza" 时,我能够保存更改。
提前致谢。
在我尝试了几件事之后,我使用了以下解决方案并且它对我有用,但我不知道它有多专业。这是我的解决方案;
我的XAML代码是
<DataGrid AutoGenerateColumns="False" Name="urunGrublariGrid" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Grup Adi" Binding="{Binding Path=grup_adi}"></DataGridTextColumn>
<DataGridComboBoxColumn Header="Yazici" Width="100" x:Name="yazicilar" DisplayMemberPath="adi" SelectedItemBinding="{Binding yazici_listesi}"
SelectedValueBinding="{Binding yazici_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
<DataGridComboBoxColumn Header="Vergi Dilimi" Width="100" x:Name="vergiler" DisplayMemberPath="vergi_orani" SelectedItemBinding="{Binding yazici_listesi}"
SelectedValueBinding="{Binding vergi_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
XAML.Cs代码
public partial class UrunIslem : Window
{
public static ObservableCollection<UrunGrubu> urun_grubu_listesi { get; set; }
public static ObservableCollection<Yazici> yazici_listesi { get; set; }
public static ObservableCollection<Vergi> vergi_listesi { get; set; }
public UrunIslem()
{
InitializeComponent();
Urun_Grubu_Islemleri();
}
private void Urun_Grubu_Islemleri()
{
UrunGrubu ug = UrunGrubu.tum_gruplar();
urun_grubu_listesi = new ObservableCollection<UrunGrubu>(UrunGrubu.urun_gruplari());
urun_grubu_listesi.Add(new UrunGrubu { grup_adi = ug.grup_adi, yazici_id= ug.yazici_id, urun_turu_id= ug.urun_turu_id, vergi_id = ug.vergi_id });
Yazici yzc = Yazici.yazicilar();
yazici_listesi = new ObservableCollection<Yazici>(Yazici.tum_yazicilar());
yazici_listesi.Add(new Yazici { adi = yzc.adi, id = yzc.id});
Vergi vrg = Vergi.tum_vergileri_getir();
vergi_listesi = new ObservableCollection<Vergi>(Vergi.tum_vergiler());
vergi_listesi.Add(new Vergi { id = vrg.id, vergi_orani = vrg.vergi_orani });
urunGrublariGrid.ItemsSource = urun_grubu_listesi;
yazicilar.ItemsSource = yazici_listesi;
vergiler.ItemsSource = vergi_listesi;
}
}
UrunGrubu Class代码是;
public class UrunGrubu
{
public int id { get; set; }
public string grup_adi { get; set; }
public int yazici_id { get; set; }
public int urun_turu_id { get; set; }
public int resim_id { get; set; }
public int vergi_id { get; set; }
public bool etkin { get; set; }
public DateTime ekleme_tarihi { get; set; }
public static UrunGrubu tum_gruplar()
{
UrunGrubu grup = new UrunGrubu();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
grup.id = Convert.ToInt32(rdr["id"]);
grup.grup_adi = rdr["grup_adi"].ToString();
grup.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
grup.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
grup.resim_id = Convert.ToInt32(rdr["resim_id"]);
grup.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
grup.etkin = Convert.ToBoolean(rdr["etkin"]);
grup.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
}
}
catch (Exception ex)
{
Genel.log("Tum Urun Gruplarini Getir Fonkisyonu", ex.Message);
throw;
}
return grup;
}
public static List<UrunGrubu> urun_gruplari()
{
List<UrunGrubu> urun_grub_listesi = new List<UrunGrubu>();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
UrunGrubu eleman = new UrunGrubu();
eleman.id = Convert.ToInt32(rdr["id"]);
eleman.grup_adi = Convert.ToString(rdr["grup_adi"]);
eleman.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
eleman.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
eleman.resim_id = Convert.ToInt32(rdr["resim_id"]);
eleman.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
eleman.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
urun_grub_listesi.Add(eleman);
}
}
catch (Exception ex)
{
Genel.log("Urun Grubu Getir", ex.Message);
throw;
}
return urun_grub_listesi;
}
}
我的另一个 class 是这样称呼 Vergi 的;
public class Vergi
{
public int id { get; set; }
public int vergi_orani {get; set;}
public bool etkin {get; set;}
public DateTime ekleme_tarihi {get;set;}
public static Vergi tum_vergileri_getir()
{
Vergi vergiler = new Vergi();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
vergiler.id = Convert.ToInt32(rdr["id"]);
vergiler.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
vergiler.etkin = Convert.ToBoolean(rdr["etkin"]);
vergiler.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
}
}
catch (Exception ex)
{
Genel.log("Tum vergileri getir", ex.Message);
throw;
}
return vergiler;
}
public static List<Vergi> tum_vergiler()
{
List<Vergi> vergiler = new List<Vergi>();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Vergi vrg = new Vergi();
vrg.id = Convert.ToInt32(rdr["id"]);
vrg.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
vrg.etkin = Convert.ToBoolean(rdr["etkin"]);
vrg.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
vergiler.Add(vrg);
}
}
catch (Exception ex)
{
Genel.log("Tum vergiler listesi", ex.Message);
throw;
}
return vergiler;
}
}
我厌烦的是使用 DataGridComboBoxColumn,它显示来自 db table 的 "Vergi" 列表,称为 "Vergi",但是从另一个 [=33] 中选择了 "Vergi" 值=] 即 "UrunGrubu"。我希望这个解决方案也能帮助其他人。
我无法在数据网格上绑定 DataGridComboBoxColumn。简而言之,我想做的是,我在数据网格上有 3 行,第一行(DataGridTextColumn)显示 Table1 中的 GrupName,第二行(DataGridComboBoxColumn)显示 Table2 中的 PrinterNames,但是从 Table1 中选择的值(PrinterID),第三行(DataGridComboBoxColumn)显示 TaxRates从表 3 中,从表 1 中选择值
因此数据网格将显示为;
Group Name Printer Name Tax Rate
--------------------------------------------
Pizza Pizza Printer 8
Salad Salad Printer 8
Beverage No Printer 8
Table 1 Table 2 Table3
-------- --------------- ----------
id id id
GroupName PrinterName TaxRate
PrinterID
TaxID
打印机名称和税率将成为 DataGridComboBoxColumn。我计划使用 ObservableCollection,因此当用户通过从 DataGridComboBoxColumn 中选择将 "Printer" 更改为 "Pizza" 时,我能够保存更改。
提前致谢。
在我尝试了几件事之后,我使用了以下解决方案并且它对我有用,但我不知道它有多专业。这是我的解决方案;
我的XAML代码是
<DataGrid AutoGenerateColumns="False" Name="urunGrublariGrid" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Grup Adi" Binding="{Binding Path=grup_adi}"></DataGridTextColumn>
<DataGridComboBoxColumn Header="Yazici" Width="100" x:Name="yazicilar" DisplayMemberPath="adi" SelectedItemBinding="{Binding yazici_listesi}"
SelectedValueBinding="{Binding yazici_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
<DataGridComboBoxColumn Header="Vergi Dilimi" Width="100" x:Name="vergiler" DisplayMemberPath="vergi_orani" SelectedItemBinding="{Binding yazici_listesi}"
SelectedValueBinding="{Binding vergi_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
XAML.Cs代码
public partial class UrunIslem : Window
{
public static ObservableCollection<UrunGrubu> urun_grubu_listesi { get; set; }
public static ObservableCollection<Yazici> yazici_listesi { get; set; }
public static ObservableCollection<Vergi> vergi_listesi { get; set; }
public UrunIslem()
{
InitializeComponent();
Urun_Grubu_Islemleri();
}
private void Urun_Grubu_Islemleri()
{
UrunGrubu ug = UrunGrubu.tum_gruplar();
urun_grubu_listesi = new ObservableCollection<UrunGrubu>(UrunGrubu.urun_gruplari());
urun_grubu_listesi.Add(new UrunGrubu { grup_adi = ug.grup_adi, yazici_id= ug.yazici_id, urun_turu_id= ug.urun_turu_id, vergi_id = ug.vergi_id });
Yazici yzc = Yazici.yazicilar();
yazici_listesi = new ObservableCollection<Yazici>(Yazici.tum_yazicilar());
yazici_listesi.Add(new Yazici { adi = yzc.adi, id = yzc.id});
Vergi vrg = Vergi.tum_vergileri_getir();
vergi_listesi = new ObservableCollection<Vergi>(Vergi.tum_vergiler());
vergi_listesi.Add(new Vergi { id = vrg.id, vergi_orani = vrg.vergi_orani });
urunGrublariGrid.ItemsSource = urun_grubu_listesi;
yazicilar.ItemsSource = yazici_listesi;
vergiler.ItemsSource = vergi_listesi;
}
}
UrunGrubu Class代码是;
public class UrunGrubu
{
public int id { get; set; }
public string grup_adi { get; set; }
public int yazici_id { get; set; }
public int urun_turu_id { get; set; }
public int resim_id { get; set; }
public int vergi_id { get; set; }
public bool etkin { get; set; }
public DateTime ekleme_tarihi { get; set; }
public static UrunGrubu tum_gruplar()
{
UrunGrubu grup = new UrunGrubu();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
grup.id = Convert.ToInt32(rdr["id"]);
grup.grup_adi = rdr["grup_adi"].ToString();
grup.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
grup.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
grup.resim_id = Convert.ToInt32(rdr["resim_id"]);
grup.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
grup.etkin = Convert.ToBoolean(rdr["etkin"]);
grup.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
}
}
catch (Exception ex)
{
Genel.log("Tum Urun Gruplarini Getir Fonkisyonu", ex.Message);
throw;
}
return grup;
}
public static List<UrunGrubu> urun_gruplari()
{
List<UrunGrubu> urun_grub_listesi = new List<UrunGrubu>();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
UrunGrubu eleman = new UrunGrubu();
eleman.id = Convert.ToInt32(rdr["id"]);
eleman.grup_adi = Convert.ToString(rdr["grup_adi"]);
eleman.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
eleman.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
eleman.resim_id = Convert.ToInt32(rdr["resim_id"]);
eleman.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
eleman.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
urun_grub_listesi.Add(eleman);
}
}
catch (Exception ex)
{
Genel.log("Urun Grubu Getir", ex.Message);
throw;
}
return urun_grub_listesi;
}
}
我的另一个 class 是这样称呼 Vergi 的;
public class Vergi
{
public int id { get; set; }
public int vergi_orani {get; set;}
public bool etkin {get; set;}
public DateTime ekleme_tarihi {get;set;}
public static Vergi tum_vergileri_getir()
{
Vergi vergiler = new Vergi();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
vergiler.id = Convert.ToInt32(rdr["id"]);
vergiler.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
vergiler.etkin = Convert.ToBoolean(rdr["etkin"]);
vergiler.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
}
}
catch (Exception ex)
{
Genel.log("Tum vergileri getir", ex.Message);
throw;
}
return vergiler;
}
public static List<Vergi> tum_vergiler()
{
List<Vergi> vergiler = new List<Vergi>();
try
{
SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Vergi vrg = new Vergi();
vrg.id = Convert.ToInt32(rdr["id"]);
vrg.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
vrg.etkin = Convert.ToBoolean(rdr["etkin"]);
vrg.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
vergiler.Add(vrg);
}
}
catch (Exception ex)
{
Genel.log("Tum vergiler listesi", ex.Message);
throw;
}
return vergiler;
}
}
我厌烦的是使用 DataGridComboBoxColumn,它显示来自 db table 的 "Vergi" 列表,称为 "Vergi",但是从另一个 [=33] 中选择了 "Vergi" 值=] 即 "UrunGrubu"。我希望这个解决方案也能帮助其他人。