我有数据集ds
DataSet ds = new DataSet();
SQL = "SELECT * FROM MyCount";
adp = new SqlCeDataAdapter(SQL, Conn);
adp.Fill(ds, "MyCount");
adp.Dispose();
Run Code Online (Sandbox Code Playgroud)
我写这样的xml: ds.WriteXml(@"\MyPath\Count.xml");
我需要在执行此操作时增加进度条.
怎么做 ?
谢谢
不幸的是,您可以使用WriteXml()方法使用的DataSet和TextWriter/XmlWriter都不允许您订阅任何"ValueWritten"事件,这将是最干净的方法.
如果你绝对必须有一个工作进度条,它会向用户显示你编写了多少XML,我建议你派生自己的XmlWriter实现,它将公开并触发一个可订阅的事件,你可以使用它来突破你的进度条.写.您可以在实现中包含一个XmlTextWriter来实际编写(我强烈建议这样做),但是您不能直接从XmlTextWriter派生.这是因为您将从XmlTextWriter扩展的方法不是虚拟的,因此您必须使用new关键字隐藏XmlTextWriter的实现.然后,DataSet.WriteXml(XmlWriter)重载会将您的类视为基本XmlWriter,因此您编写的隐藏XmlTextWriter实现的方法将被忽略.
您需要权衡的其他注意事项:
编辑:实际上,因为XmlWriter声明了XmlTextWriter必须实现的抽象方法,所以你可以在自定义类中进一步覆盖它们,这样你就可以直接从XmlTextWriter继承.
一些示例代码:
public class ObservableXmlTextWriter: XmlTextWriter
{
public delegate void XmlWriteHandler(object sender, XmlWriteEventArgs e);
public event XmlWriteHandler XmlWritten;
public event EventHandler XmlWriteComplete;
public class XmlWriteEventArgs:EventArgs
{
public object Value{get; private set;}
public XmlWriteEventArgs(object value) {Value = value;}
}
public override WriteValue(string value)
{
base.WriteValue(value);
if(XmlWritten != null) XmlWritten(this, new XmlWriteEventArgs(value));
}
public override WriteValue(int value)
{
base.WriteValue(value);
if(XmlWritten != null) XmlWritten(this, new XmlWriteEventArgs(value));
}
... //override ALL Write methods to fire XmlWritten as above
//Dispose will call Close(), so just make sure to do one or the other
public override Close()
{
base.Close(value);
if(XmlWriteComplete!= null) XmlWriteComplete(this, new EventArgs()));
}
}
...
public void XmlWriteHandler(object sender, XmlWriteEventArgs e)
{
//Feel free to come up with your own algorithm for approaching 100%;
//the number of times this event fires will be proportional to the
//number of data elements (rows * columns) in the DataSet.
MyProgressBar.Increment((MyProgressBar.Maximum - MyProgressBar.Value) * .05)
}
public void XmlWriteCompleteHandler(object sender, EventArgs e)
{
MyProgressBar.Value = MyProgressBar.Maximum;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |