| ■No87059 (kaz さん) に返信
<追伸>
> 【質問2】
> datagridviewにチェックボックスが配置されていて
> チェックをつけたセルについては、
> <checked>true</checked>
> と出力されるのですが
> チェックがついていないセルについては
> 【質問1】の状況と似たように
> 項目自体が出力されません
こちらは自分が試した限りでは再現できませんでした。
DataGridView 上でのチェックボックスのチェックの有無と xml ファイルの true / false は
きちんと期待通りに対応します。
どのように試したかと言うと、以下の通りです。質問者さんのケースとどこが違うかチェック
してみてください。
(1) SQL Server の Microsoft のサンプルデータベースの Northwind の Products テーブルか
ら以下のクエリを使ってインラインスキーマ付きの xml を生成。
use NORTHWIND
go
select top 5 * from Products FOR XML raw('product'),
root('root'), elements, XMLSCHEMA('MyURI')
UserInfo.xml という名
前を付けて xml ファイルとして保存。
(2) Visual Studio で Windows Forms アプリのプロジェクトを作成。それに、上記 (1) の手順
で作った xml を UserInfo.xml という名前を付けて保存。
(3) Windows Forms アプリに以下のクラスファイル(ビジネスロジック)を追加。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace EditXmlFileOnDataGridView
{
public class UserInfoTable : IDisposable
{
const string filePath = @"C:\Users\...\UserInfo.xml";
private DataSet myDataSet;
public UserInfoTable()
{
myDataSet = new DataSet();
myDataSet.Locale = System.Globalization.CultureInfo.InvariantCulture;
myDataSet.ReadXml(filePath, XmlReadMode.ReadSchema);
}
public virtual void Dispose(bool disposing)
{
if (disposing)
{
myDataSet.Dispose();
}
}
public void Dispose()
{
Dispose(true);
System.GC.SuppressFinalize(this);
}
~UserInfoTable()
{
Dispose(false);
}
public DataSet GetDataSet()
{
return myDataSet;
}
// ・・・中略・・・
public void Save()
{
myDataSet.WriteXml(filePath, XmlWriteMode.WriteSchema);
}
}
}
(4) 自動生成されている Form1 にデザイン画面で DataGridView, Button を貼り付け。
以下のコードを書く。
using System;
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 EditXmlFileOnDataGridView
{
public partial class Form1 : Form
{
private BindingSource bindingSource1 = new BindingSource();
private UserInfoTable userInfo;
public Form1()
{
InitializeComponent();
this.userInfo = new UserInfoTable();
DataTable table = userInfo.GetDataSet().Tables[0];
table.AcceptChanges();
this.bindingSource1.DataSource = table;
this.dataGridView1.DataSource = bindingSource1;
}
private void button1_Click(object sender, EventArgs e)
{
this.bindingSource1.EndEdit();
this.userInfo.Save();
this.userInfo.GetDataSet().Tables[0].AcceptChanges();
}
}
} |