C# Windows 表单 - 将 XML 读入 checkedlistbox
C# Windows Forms - read XML into checkedlistbox
我正在使用 C# 在 VisualStudio 中创建一个 Windows Forms 应用程序。
我有一个这样的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Team>
<TeamMember>
<Name>Jack John</Name>
<MailAddress>Jack@test.com</MailAddress>
<SearchName>John, Jack</SearchName>
<AltSearchName>Jack John 123</AltSearchName>
</TeamMember>
<TeamMember>
<Name>Johanna Johnson</Name>
<MailAddress>Johanna@test.com</MailAddress>
<SearchName>Johnson, Johanne</SearchName>
<AltSearchName>Johanna Johnson 123</AltSearchName>
</TeamMember>
<TeamMember>
<Name>Ron Ma</Name>
<MailAddress>Ron@test.com</MailAddress>
<SearchName>Ma, Ron</SearchName>
<AltSearchName></AltSearchName>
</TeamMember>
</Team>
我想实现的是把所有的名字(没有XML的其他信息)放到一个CheckedListBox中。
目标是创建一个程序,您可以在其中粘贴一长串人员和电子邮件地址,并且代码会在该字符串中搜索 XML 中的所有团队成员。如果长字符串包含 TeamMembers,它将“选中”相应人员的 CheckedListBox 中的框。
我目前拥有的:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestMailVerteiler
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataSet ds = new DataSet();
string fileNameWithAbsolutePath = "C:/Test/Text.xml";
ds.ReadXml(fileNameWithAbsolutePath);
if (ds.Tables.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
checkedListBox1.Items.Add(ds.Tables[0].Rows[i][j].ToString());
}
}
}
}
}
}
但是他的(如预期的那样)会将 XML 的所有信息放入 CheckedListBox。
我在想什么:
- 从我的 xml 文件
创建一个内部“table/class (?)”
- 使用table列“名称”填写CheckedListBox
- 稍后使用其他 table 列搜索输入字符串并匹配“名称”,如果找到匹配项,按下按钮后,相应地检查列表框。
我怎样才能做到这一点?
最简单的是:
ds.ReadXml(fileNameWithAbsolutePath);
if (ds.Tables.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
checkedListBox1.Items.Add(ds.Tables[0].Rows[i][0].ToString());
}
}
但是,实施 class 是个好主意。要自动执行此操作,select 您的整个 XML 并复制到剪贴板。在 Visual Studio 中,将光标置于要插入 class 的位置。它应该在 Form1 之外,但在同一命名空间内或在单独的 class 文件中。然后转到编辑(菜单)并粘贴特殊 > 粘贴为 XML class.
会出这样的东西:
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Team
{
private TeamTeamMember[] teamMemberField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("TeamMember")]
public TeamTeamMember[] TeamMember
{
get
{
return this.teamMemberField;
}
set
{
this.teamMemberField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class TeamTeamMember
{
private string nameField;
private string mailAddressField;
private string searchNameField;
private string altSearchNameField;
/// <remarks/>
public string Name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
public string MailAddress
{
get
{
return this.mailAddressField;
}
set
{
this.mailAddressField = value;
}
}
/// <remarks/>
public string SearchName
{
get
{
return this.searchNameField;
}
set
{
this.searchNameField = value;
}
}
/// <remarks/>
public string AltSearchName
{
get
{
return this.altSearchNameField;
}
set
{
this.altSearchNameField = value;
}
}
}
现在,这是反序列化您的 xml 并仅提取您的 checkedListbox 中的名称的代码:
XmlSerializer xs = new XmlSerializer(typeof(Team));
using (StreamReader rd = new StreamReader(MyXmlFile))
{
Team team = xs.Deserialize(rd) as Team;
int n = team.TeamMember.Length;
for (int i = 0; i < n; i++)
{
checkedListBox1.Items.Add(team.TeamMember[i].Name);
}
}
您必须在开头插入以下参考资料:
using System.Xml.Serialization;
using System.IO;
我正在使用 C# 在 VisualStudio 中创建一个 Windows Forms 应用程序。
我有一个这样的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Team>
<TeamMember>
<Name>Jack John</Name>
<MailAddress>Jack@test.com</MailAddress>
<SearchName>John, Jack</SearchName>
<AltSearchName>Jack John 123</AltSearchName>
</TeamMember>
<TeamMember>
<Name>Johanna Johnson</Name>
<MailAddress>Johanna@test.com</MailAddress>
<SearchName>Johnson, Johanne</SearchName>
<AltSearchName>Johanna Johnson 123</AltSearchName>
</TeamMember>
<TeamMember>
<Name>Ron Ma</Name>
<MailAddress>Ron@test.com</MailAddress>
<SearchName>Ma, Ron</SearchName>
<AltSearchName></AltSearchName>
</TeamMember>
</Team>
我想实现的是把所有的名字(没有XML的其他信息)放到一个CheckedListBox中。 目标是创建一个程序,您可以在其中粘贴一长串人员和电子邮件地址,并且代码会在该字符串中搜索 XML 中的所有团队成员。如果长字符串包含 TeamMembers,它将“选中”相应人员的 CheckedListBox 中的框。
我目前拥有的:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestMailVerteiler
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataSet ds = new DataSet();
string fileNameWithAbsolutePath = "C:/Test/Text.xml";
ds.ReadXml(fileNameWithAbsolutePath);
if (ds.Tables.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
checkedListBox1.Items.Add(ds.Tables[0].Rows[i][j].ToString());
}
}
}
}
}
}
但是他的(如预期的那样)会将 XML 的所有信息放入 CheckedListBox。
我在想什么:
- 从我的 xml 文件 创建一个内部“table/class (?)”
- 使用table列“名称”填写CheckedListBox
- 稍后使用其他 table 列搜索输入字符串并匹配“名称”,如果找到匹配项,按下按钮后,相应地检查列表框。
我怎样才能做到这一点?
最简单的是:
ds.ReadXml(fileNameWithAbsolutePath);
if (ds.Tables.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
checkedListBox1.Items.Add(ds.Tables[0].Rows[i][0].ToString());
}
}
但是,实施 class 是个好主意。要自动执行此操作,select 您的整个 XML 并复制到剪贴板。在 Visual Studio 中,将光标置于要插入 class 的位置。它应该在 Form1 之外,但在同一命名空间内或在单独的 class 文件中。然后转到编辑(菜单)并粘贴特殊 > 粘贴为 XML class.
会出这样的东西:
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Team
{
private TeamTeamMember[] teamMemberField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("TeamMember")]
public TeamTeamMember[] TeamMember
{
get
{
return this.teamMemberField;
}
set
{
this.teamMemberField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class TeamTeamMember
{
private string nameField;
private string mailAddressField;
private string searchNameField;
private string altSearchNameField;
/// <remarks/>
public string Name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
public string MailAddress
{
get
{
return this.mailAddressField;
}
set
{
this.mailAddressField = value;
}
}
/// <remarks/>
public string SearchName
{
get
{
return this.searchNameField;
}
set
{
this.searchNameField = value;
}
}
/// <remarks/>
public string AltSearchName
{
get
{
return this.altSearchNameField;
}
set
{
this.altSearchNameField = value;
}
}
}
现在,这是反序列化您的 xml 并仅提取您的 checkedListbox 中的名称的代码:
XmlSerializer xs = new XmlSerializer(typeof(Team));
using (StreamReader rd = new StreamReader(MyXmlFile))
{
Team team = xs.Deserialize(rd) as Team;
int n = team.TeamMember.Length;
for (int i = 0; i < n; i++)
{
checkedListBox1.Items.Add(team.TeamMember[i].Name);
}
}
您必须在开头插入以下参考资料:
using System.Xml.Serialization;
using System.IO;