【发布时间】:2021-06-15 15:10:57
【问题描述】:
我使用 c# 作为主要编程语言。将 EF 链接到 WPF 应用程序。 我想要的东西:保存\加载角色或/和玩家信息并使用它的可能性。 我有的东西:
带有玩家和角色表的本地数据库。 玩家有:
P_ID
P_Name
人物有
id (int)
name (nvarchar50)
pid (int)
STR (int)
DEX (int)
INT (int)
我发现实体框架是我想要的很好的解决方案(至少我是这么认为的)。
目前我的角色和玩家类看起来像这样:
public class Character
{
[Key]
public int id { get; set; }
public string name { get; set; }
public int pid { get; set; }
public int STR { get; set; }
public int DEX { get; set; }
public int INT { get; set; }
[ForeignKey("pid")]
public virtual Player Player { get; set; }
}
public class Player
{
[Key]
public int P_ID { get; set; }
public string P_Name { get; set; }
public virtual ICollection<Character> Characters { get; set; }
}
MyDBcontext 类:
public class MyDBcontext : DbContext
{
public MyDBcontext() : base("Datasex_0._1.Properties.Settings.StraightCon")
{
}
public DbSet<Player> Players { get; set; }
public DbSet<Character> Characters { get; set; }
}
和 MainWindow.xaml.cs 代码:
public partial class MainWindow : Window
{
MyDBcontext mdb;
List<Player> playerlist = new List<Player>();
List<Character> charlist = new List<Character>();
public MainWindow()
{
InitializeComponent();
mdb = new MyDBcontext();
mdb.Players.Load();
mdb.Characters.Load();
var charlist = mdb.Characters.ToList();
var playerlist = mdb.Players.ToList();
PlayerBox.ItemsSource = mdb.Players.ToList();
CharacterData.ItemsSource = charlist;
this.Closing += MainWindow1_Closed;
}
private void MainWindow1_Closed(object sender, EventArgs e)
{
mdb.Dispose();
}
}
我需要什么:
我已将用于测试目的的数据网格链接到一个列表。与此有关的问题:datagrid 显示这样的玩家:
我不需要玩家在 charlist 中。 为什么我需要列表 - 在这里我发现可以使用列表进行组合框比较。
我需要在玩家框(第一个组合框)中显示所有玩家 - 我做到了。 然后我需要在 Characterbox 组合框中显示通过 pid 绑定到玩家 P_ID 的字符。
在此之后,我需要在文本框中显示(我将在完成字符任务后添加)字符统计信息(str dex 和 int)。 然后我需要将自定义播放器添加到数据库的功能(我知道怎么做,因为在 winforms 应用程序中对其进行了测试)。
然后我需要在playerbox中根据选择的玩家添加自定义角色(我不知道怎么做)。
最后我需要能够在 UI 中更改字符信息(名称、str、dex 等)。
感谢您的帮助和提示,抱歉我的英语不好。
编辑: 添加了一些我认为不起作用的东西:
private string[] getcharbyid (int pid)
{
return charlist.Where(Line => Line.pid == pid).Select(l => l.name).ToArray();
}
和
private void PlayerBox_SelectionChanged(对象发送者,SelectionChangedEventArgs e) { if (CharacterBox != null) CharacterBox.Items.Clear();
int xid = charlist[PlayerBox.SelectedIndex].pid;
indextest.Content = xid;
foreach (string name in getcharbyid(xid))
{
this.CharacterBox.Items.Add(name);
}
应用程序启动时显示:System.ArgumentOutOfRangeException
这样比较 id 和 index:
PlayerData.ItemsSource = mdb.Players.ToList();
int xid = PlayerBox.SelectedIndex;
indextest.Content = xid;
似乎 id 和 index (或者我做错了什么)是相同的。 尝试更改 foreach 失败。
更改了一些代码以将字符添加到字符框:
int xid;
Int32.TryParse(PlayerBox.SelectedValue.ToString(), out xid);
indextest.Content = xid;
CharacterBox.Items.Add (from Character in charlist where Character.pid == xid select Character);
CharacterBox.DisplayMemberPath = "name";
CharacterBox.SelectedValuePath = "id";
看起来像是添加到组合框中的字符,但我没有看到它们的名称和值:
【问题讨论】:
-
如果我做错了什么并且有很多简单的方法可以做到这一点(比如扔掉 EF 和 stat 处理 sql 命令)会很高兴看到你的想法和建议。
标签: c# wpf entity-framework