传送门
python集成Bartender的雏形
python写上位机(集成Bartender)
许多朋友不知道SDK的使用手册怎么获取,答案如下:
安装Bartender试用版,到开始目录下可以看到
SDK的内容分四部分:
暂时只需要客户端打印系统,研究简单的打印模式。
最开始时需要创建一个Engine对象,然后启动,打开文件,打印,停止,释放资源。
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\Format1.btw");
// Print the format.
btFormat.Print();
// Stop the BarTender print engine.
btEngine.Stop();
}
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\Format1.btw");
// Print the format.
btFormat.Print();
// Stop the BarTender print engine.
btEngine.Stop();
}
特性:
new Engine(true)
Engine btEngine = new Engine()
btEngine.Start()
btEngine.Stop()
btEngine.Stop(SaveOptions.SaveChanges)
btEngine .Dispose()
btEngine.Window.Visible = true
当Engine引擎被启动时,就会监控打印状态。Engine类的evevts,存放着事件处理函数的指针,可以触发多个回调函数。
// Hook up to job cancelled event.
btEngine.JobCancelled += new EventHandler<PrintJobEventArgs>(btEngine_JobCancelled);
btEngine.JobErrorOccurred += new EventHandler<PrintJobEventArgs>(btEngine_JobErrorOccurred);
btEngine.JobMonitorErrorOccurred += new EventHandler<MonitorErrorEventArgs>(btEngine_JobMonitorErrorOccurred);
btEngine.JobPaused += new EventHandler<PrintJobEventArgs>(btEngine_JobPaused);
btEngine.JobQueued += new EventHandler<PrintJobEventArgs>(btEngine_JobQueued);
btEngine.JobRestarted += new EventHandler<PrintJobEventArgs>(btEngine_JobRestarted);
btEngine.JobResumed += new EventHandler<PrintJobEventArgs>(btEngine_JobResumed);
btEngine.JobSent += new EventHandler<JobSentEventArgs>(btEngine_JobSent);
详细内容暂时跳过
LabelFormatDocument类
标签模版类,该类的实例对象代表.btw文件,用户可以通过该类对标签模板进行修改和打印。另外,每一个Engine对象都包含了一系列打开的.btw文件,简称文件集(The Documents Collection)。
打开一个.btw文件:
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabel.btw");
关闭一个.btw文件,为节省资源,最好是用完即关闭:
btFormat.Close(SaveOptions.DoNotSaveChanges);
通过调用LabelFormatDocument类的打印方法可以打印标签模板
Result是一个enum类型,Success=0,Timeout=1,Failure=2
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabel.btw");
Result result = btFormat.Print();
// Display the print result.
Console.WriteLine("Print status = " + nResult);
参数:printJobName,打印任务名,如果为空,则会使用标签模板名
返回值:Result是一个enum类型,Success=0,Timeout=1,Failure=2
Messages messages = null;
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabel.btw");
Result result = btFormat.Print("PrintJob1", out messages);
参数:printJobName,打印任务名,如果为空,则会使用标签模板名
参数:messages,传入时是空的消息集合,返回时被函数内部填充,每一次打印都会在Message对象的text属性中写入内容。Messages类是一个集合类型,集合中的元素是Message类。
返回值:Result是一个enum类型,Success=0,Timeout=1,Failure=2
参数:printJobName,打印任务名,如果为空,则会使用标签模板名
参数:waitForCompletionTimeout,打印超时时间,ms单位
返回值:Result是一个enum类型,Success=0,Timeout=1,Failure=2
参数:printJobName,打印任务名,如果为空,则会使用标签模板名
参数:messages,传入时是空的消息集合,返回时被函数内部填充,每一次打印都会在Message对象的text属性中写入内容。Messages类是一个集合类型,集合中的元素是Message类。
参数:waitForCompletionTimeout,打印超时时间,ms单位
返回值:Result是一个enum类型,Success=0,Timeout=1,Failure=2
假设一个Engine对象中打开了多个LabelFormatDocument对象,一次性全部打印:
int i = 0;
foreach (LabelFormatDocument format in btEngine.Documents)
{
i++;
format.Print("PrintJob" + i);
}
btFormat.PrintSetup.NumberOfSerializedLabels:规定了序列长度
btFormat.PrintSetup.IdenticalCopiesOfLabel:规定了重复次数
// Initialize and start a new engine
using (Engine btEngine = new Engine())
{
btEngine.Start();
// Open a label format.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\MyLabel.btw");
// Change the number of identical labels and serialized labels to print
btFormat.PrintSetup.NumberOfSerializedLabels = 4;
btFormat.PrintSetup.IdenticalCopiesOfLabel = 10;
// Print the label
Result result = btFormat.Print();
}
打开标签模版时配置打印机
或给标签模版的成员属性PrinterName 配置打印机
// Initialize and start a new engine
using (Engine btEngine = new Engine())
{
btEngine.Start();
// Open a label format specifying the default printer
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\MyLabel1.btw");
// Print the label
Result result = btFormat.Print("PrintJob1");
// Open a label format specifying a different printer
btFormat = btEngine.Documents.Open(@"C:\MyLabel2.btw", "OurPrinter_HX3000");
// Print the label
result = btFormat.Print();
/*
// Change the name of the printer
btFormat.PrintSetup.PrinterName = @"OurPrinter_HX3000";
*/
}
读取和修改标签模板的内容,没有新建的方法
每个标签模板包含一系列的字段,这些字段类似于python中的字典,具备键值对。
Engine btEngine = new Engine();
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\MyLabel.btw");
string AddressSubstring = btFormat.SubStrings["Address"].Value;
Engine btEngine = new Engine();
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabel.btw");
btFormat.SubStrings["Address"].Value = "1313 Mockingbird Lane, Anywhere, USA";
btFormat.SubStrings["Name"].Value = "John Doe";
btFormat.SubStrings["Quantity"].Value = "10";
/*
btFormat.SubStrings[“Quantity”].Value = “10”;
"Quantity"就是键(key),"10"就是值(value),通过键能够调出值的内容
*/
数据库打印,暂时跳过
Job Status Events依赖于Maestro Print Service监控程序。
LabelFormatDocument类与Engine类还有Printer类等等,许多类型都有相应的事件Event。下面具体研究 Engine 与 LabelFormatDocument 类的Event机制,其他类大同小异,暂时略过。
订阅,类似于信号绑定。将处理函数的指针推入列表的相应位置。
// Open a label format
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabelFormat.btw");
// Subscribe to the format event
btFormat.JobQueued += new EventHandler<PrintJobEventArgs>(MyLabelFormatOnJobQueued);
/* 订阅了JobQueued事件,MyLabelFormatOnJobQueued为事件处理函数 */
针对Engine类,有以下程序:
// Called by a worker thread when a job is queued
public void btEngine_JobQueued(object sender, PrintJobEventArgs e)
{
// 类型转换,将基类对象转换成子类对象
Engine btEngine = sender as Engine;
if (btEngine != null)
{
Console.WriteLine(string.Format("Client {0} has printed or is printing {1} jobs", e.ClientName, btEngine.PrintJobCounter));
}
}
btEngine_JobQueued是回调函数名,与订阅时的函数相对应。
参数:sender,当一个打印事件被推入打印队列时,假若该打印事件对应的Engine对象或LabelFormatDocument对象曾经订阅过JobQueued类型的事件,那么这些对象就会作为sender参数。
参数:PrintJobEventArgs,打印事件的相关信息。
上例代表了一个Engine对象调用btEngine_JobQueued的场景。
针对LabelFormatDocument类,有以下程序:
public void ProgramModule()
{
// Initialize and start a BarTender Engine
using (Engine btEngine = new Engine(true))
{
// Open a label format
LabelFormatDocument btFormat = btEngine.Documents.Open(@"c:\MyLabelFormat.btw");
// Subscribe to the format event
btFormat.JobQueued += new EventHandler<PrintJobEventArgs>(MyLabelFormatOnJobQueued);
// Print the label
btFormat.Print();
// Stop the BarTender Engine
btEngine.Stop(SaveOptions.DoNotSaveChanges);
}
}
public void MyLabelFormatOnJobQueued(object sender, PrintJobEventArgs printJobEventInfo)
{
// 类型转换,将基类对象转换成子类对象
LabelFormatDocument btFormat = sender as LabelFormatDocument;
// Check to see if the object is not null
// If it is, the sender was NOT a Format
if (btFormat != null)
{
// Do something with the label format
}
}
上例中,Handler函数形式为:
public void MyLabelFormatOnJobQueued(object sender, PrintJobEventArgs printJobEventInfo)
第二个参数可以有3种类型,PrintJobEventArgs
、JobSentEventArgs
、MonitorErrorEventArgs
PrintJobEventArgs:代表普通打印任务的事件
JobSentEventArgs:是PrintJobEventArgs的子类,只多了一个成员变量,JobPrintingVerified,表示已经打印完成或已被发送到物理打印机(而不是库中的缓存队列)。
MonitorErrorEventArgs:监控错误事件,区别上面2种。
9个事件类型分别是:CommandLineCompleted Event、JobCancelled Event、JobErrorOccurred、JobMonitorErrorOccurred、JobPaused、JobQueued、JobRestarted、JobResumed、JobSent
CommandLineCompleted Event:命令完成,区别LabelFormatDocument Event
JobCancelled Event:任务关闭。
在一个Engine中,通常监控了多个LabelFormatDocument,
当其中一个LabelFormatDocument产生打印任务关闭事件时,对应的LabelFormatDocument下会产生JobCancelled,
并且同时,Engine也会产生JobCancelled。以下的其他事件类型也同理。
JobErrorOccurred:任务错误
JobMonitorErrorOccurred:监控错误
JobPaused:暂停
JobQueued:入列
JobRestarted:重启
JobResumed:回溯
JobSent:发送
如果需要对不同的LabelFormatDocument配置不同的事件处理,则需要在LabelFormatDocument下配置不同的回调函数。
但是,若是对所有的LabelFormatDocument事件都可以统一处理,此处就没必要逐个LabelFormatDocument配置了。直接在Engine下配置回调函数即可。
8个事件类型分别是:JobCancelled 、JobErrorOccurred 、JobMonitorErrorOccurred 、JobPaused 、JobQueued 、JobRestarted 、JobResumed 、JobSent
注意:少了一个CommandLineCompleted Event
public void Demo()
{
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format to be printed.
btEngine.Documents.Open(@"C:\Format1.btw");
// Hook up to job cancelled event.
btEngine.JobCancelled += new EventHandler<PrintJobEventArgs>(btEngine_JobCancelled);
btEngine.JobErrorOccurred += new EventHandler<PrintJobEventArgs>(btEngine_JobErrorOccurred);
btEngine.JobMonitorErrorOccurred += new EventHandler<MonitorErrorEventArgs>(btEngine_JobMonitorErrorOccurred);
btEngine.JobPaused += new EventHandler<PrintJobEventArgs>(btEngine_JobPaused);
btEngine.JobQueued += new EventHandler<PrintJobEventArgs>(btEngine_JobQueued);
btEngine.JobRestarted += new EventHandler<PrintJobEventArgs>(btEngine_JobRestarted);
btEngine.JobResumed += new EventHandler<PrintJobEventArgs>(btEngine_JobResumed);
btEngine.JobSent += new EventHandler<JobSentEventArgs>(btEngine_JobSent);
// Declare a commandline and execute it
// (this commandline will print all open formats).
String commandLine = "/P";
btEngine.CommandLine(commandLine);
// Since the commandline is processed asynchronously, we must
// wait for printing to complete before stopping the engine.
while (btEngine.IsProcessingCommandLines || btEngine.IsPrinting)
System.Threading.Thread.Sleep(500);
// Stop the BarTender print engine.
btEngine.Stop(SaveOptions.PromptSave);
}
}
往文件里打印??再发送文件至打印机??
一个Engine对象代表一个打印引擎实体。
name | mean |
---|---|
Engine() | 创建一个引擎实例 |
Engine(Boolean) | 创建一个引擎实例,并指定是否在创建时就默认调用start |
name | mean |
---|---|
ActiveDocument | 最近一个使用的标签模板 |
BuildNumber | 当前Engine对象的创建编号 |
Documents | 打开的标签模板列表 |
Edition | 当前BarTender Application的版本 |
FullVersion | BarTender application的完整版本 |
IsAlive | 是否程序正在运行 |
IsPrinting | 是否正在打印 |
IsProcessingCommandLines | 是否正在处理命令行指令 |
IsResponsive | 在规定时间内是否响应 |
ResponsiveTimeout | 响应超时定时器 |
LicenseServer | 获取准许证服务程序对象 |
PrintJobCounter | 打印任务计数值 |
SAPIDocDefinitionFile | 获取或设置SAP IDoc配置文件名 |
SupportNumber | 获取BarTender应用程序的支持号码 |
Version | 获取BarTender应用程序的版本 |
Window | 获取对Window对象的引用,该对象控制BarTender应用程序的Window的外观 |
name | mean |
---|---|
CommandLine() | 提交命令行以供BarTender打印引擎处理 |
Dispose() | 关闭Engine,并释放资源 |
Dispose(Boolean) | 关闭引擎并释放对象所拥有的资源,指定是否可以处置托管资源 |
Finalize | 析构函数 |
IsProductKeyCode(String) | 生产密钥是否匹配软件 |
Restart | 停止,并重启 |
Start() | 启动进程 |
Stop() | 暂停进程 |
Name | Mean |
---|---|
CommandLineCompleted | 命令行完成时触发 |
JobCancelled | 打印关闭时触发 |
JobErrorOccurred | 打印作业出错时触发 |
JobMonitorErrorOccurred | 当引擎在监视打印作业时遇到错误时发生 |
JobPaused | 打印作业暂停时触发 |
JobQueued | 打印作业入队时触发 |
JobRestarted | 打印作业重新开始时触发 |
JobResumed | 打印作业暂停后,恢复打印时触发 |
JobSent | 在将打印作业发送到打印机端口时触发,打印机收到数据后才开始打印,但是上位机已经无法知晓外部打印机的工作状态了 |
public void Demo()
{
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format to be printed.
btEngine.Documents.Open(@"C:\Format1.btw");
// Hook up to job cancelled event.
// 回调函数都需要程序员额外定义在函数体外部。这里使用‘+=’说明一个事件可能触发多个回调函数
btEngine.JobCancelled += new EventHandler<PrintJobEventArgs>(btEngine_JobCancelled);
btEngine.JobErrorOccurred += new EventHandler<PrintJobEventArgs>(btEngine_JobErrorOccurred);
btEngine.JobMonitorErrorOccurred += new EventHandler<MonitorErrorEventArgs>(btEngine_JobMonitorErrorOccurred);
btEngine.JobPaused += new EventHandler<PrintJobEventArgs>(btEngine_JobPaused);
btEngine.JobQueued += new EventHandler<PrintJobEventArgs>(btEngine_JobQueued);
btEngine.JobRestarted += new EventHandler<PrintJobEventArgs>(btEngine_JobRestarted);
btEngine.JobResumed += new EventHandler<PrintJobEventArgs>(btEngine_JobResumed);
btEngine.JobSent += new EventHandler<JobSentEventArgs>(btEngine_JobSent);
// Declare a commandline and execute it
// (this commandline will print all open formats).
String commandLine = "/P";
btEngine.CommandLine(commandLine);
// Since the commandline is processed asynchronously, we must
// wait for printing to complete before stopping the engine.
while (btEngine.IsProcessingCommandLines || btEngine.IsPrinting)
System.Threading.Thread.Sleep(500);
// Stop the BarTender print engine.
btEngine.Stop(SaveOptions.PromptSave);
}
}
LabelFormatDocument的类实例代表一个.btw文件。
// Open a format document.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\Format1.btw");
构造函数
成员变量
Name | Mean |
---|---|
Attached | 返回此对象是否附加到BarTender自动化对象。(继承自BtAutomationObject。) |
BaseName | 获取标签格式文件名的基础部分。 只读。(继承自LabelFormat。) |
Comment | 获取或设置标签格式的注释。(继承自LabelFormat。) |
DatabaseConnections | 获取为标签格式定义的DatabaseConnections列表。 只读。(继承自LabelFormat。) |
Detached | 返回此对象是否与BarTender自动化对象分离。(继承自BtAutomationObject。) |
Directory | 获取标签格式文件所在的目录。只读。(继承自LabelFormat。) |
Encryption | 获取或设置标签格式的加密密钥。(继承自LabelFormat。) |
FileName | 获取标签格式文件的完整路径。 只读。(继承自LabelFormat。) |
IsModified | 获取或设置文档是否已修改。(继承自LabelFormat。) |
LatestSaveNumber | 获取格式的最新修订号。 返回:LabelFormat.NullLabelFormat(如果Bt Format接口为null)。 如果尚未保存格式,或者版本日志功能已关闭,则为0。 否则,返回当前的修订号。(继承自LabelFormat。) |
PageSetup | 获取标签格式的PageSetup对象。 只读。(继承自LabelFormat。) |
PasswordProtections | 获取标签格式的PasswordProtections对象。 PasswordProtections包含用于指定哪些操作受密码保护的值(继承自LabelFormat。) |
PrinterCodeTemplate | 获取或设置一个PrinterCodeTemplate对象,该对象用于配置和导出打印机代码模板。(继承自LabelFormat。) |
PrintJobCounter | 获取此LabelFormatDocument所拥有的当前正在打印或在打印机队列中的打印作业数。 |
PrintPreview | 获取标签格式的PrintPreview对象。 PrintPreview对象使用户能够显示和控制打印预览窗口。(继承自LabelFormat。) |
PrintSetup | 获取标签格式的PrintSetup对象。 PrintSetup对象保存有关打印机设置的数据,例如份数和打印机名称。(继承自LabelFormat。) |
Prompts | 获取标签格式的打印时间列表。 只读。(继承自LabelFormat。) |
Status | 表示LabelFormat的当前状态,有关该状态之前是否在BarTender中打开过,以及是否已缓存该格式的数据。(继承自LabelFormat。) |
SubStrings | 获取标签格式上的所有数据列表(数据名,以字符串形式)。 只读。(继承自LabelFormat。) |
Title | 获取标签格式的标题。 只读。(继承自LabelFormat。) |
ViewRecordNavigator | 获取ViewRecordNavigator对象,该对象用于支持模板设计中数据库记录的浏览。(继承自LabelFormat。) |
Name | Mean |
---|---|
Activate | 将此格式设置为此BarTender引擎实例的活动格式。Activate方法会将LabelFormatDocument分配给BarTender打印引擎的ActiveDocument属性。 如果BarTender打印引擎是可见的,则格式窗口将获得焦点。 |
Close | |
ExportImageToClipboard | 将标签格式的位图表示复制到剪贴板 |
ExportImageToFile | 将格式导出到图像文件 |
ExportPrintPreviewRangeToFile | 导出页面范围的打印预览 |
ExportPrintPreviewToFile | 将打印预览导出到图像文件 |
Print() | Result nResult = btFormat.Print(); |
Print(String) | |
Print(String, Messages) | |
Print(String, Int32) | |
Print(String, Int32, Messages) | Result nResult = btFormat.Print(“Test Print”, 6000, out btMessages);// 打印时指定作业名称和等待超时,并获取所有返回的消息 |
Save | 保存格式 |
SaveAs | btFormat.SaveAs(@“C:\Format2.btw”, true);// 用新名称保存格式,覆盖任何现有文件 |
SpecifyDocumentPassword | 指定用于密码保护操作的文档密码 |
public void Demo()
{
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format document.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\Format1.btw");
// Hook up to job events.
btFormat.JobCancelled += new EventHandler<PrintJobEventArgs>(btFormat_JobCancelled);
btFormat.JobErrorOccurred += new EventHandler<PrintJobEventArgs>(btFormat_JobErrorOccurred);
btFormat.JobMonitorErrorOccurred += new EventHandler<MonitorErrorEventArgs>(btFormat_JobMonitorErrorOccurred);
btFormat.JobPaused += new EventHandler<PrintJobEventArgs>(btFormat_JobPaused);
btFormat.JobQueued += new EventHandler<PrintJobEventArgs>(btFormat_JobQueued);
btFormat.JobRestarted += new EventHandler<PrintJobEventArgs>(btFormat_JobRestarted);
btFormat.JobResumed += new EventHandler<PrintJobEventArgs>(btFormat_JobResumed);
btFormat.JobSent += new EventHandler<JobSentEventArgs>(btFormat_JobSent);
// Print the format.
btFormat.Print();
// Close the current format without saving.
btFormat.Close(SaveOptions.DoNotSaveChanges);
// Stop the BarTender print engine.
btEngine.Stop();
}
属于LabelFormatDocument类的一个成员,一般在打印前设置PrintSetup,用例如下
public void Demo()
{
// Initialize a new BarTender print engine.
using (Engine btEngine = new Engine())
{
// Start the BarTender print engine.
btEngine.Start();
// Open a format document.
LabelFormatDocument btFormat = btEngine.Documents.Open(@"C:\Format1.btw");
// Set the number of identical copies.
btFormat.PrintSetup.IdenticalCopiesOfLabel = 2;
// Set the number of serialized copies.
btFormat.PrintSetup.NumberOfSerializedLabels = 10;
// Change the comment on the format.
btFormat.Comment = "This format now contains serialized object values";
// Print the format.
btFormat.Print();
// Stop the BarTender print engine saving all changes.
btEngine.Stop(SaveOptions.SaveChanges);
}
}
name | mean |
---|---|
Attached | 是否绑定了自动化对象 |
AutoPrintAgain | 自动连续打印 |
Cache | 缓存 |
Detached | 是否无任何自动化对象与之绑定 |
EnablePrompting | 在打印时提示数据交互时间 |
IdenticalCopiesOfLabel | 副本数量 |
IsIdenticalCopiesUnlimited | 副本数量不受限制标志位 |
IsNumberSerializedLabelsUnlimited | 序列号不受限制标志位 |
JobName | 打印任务名 |
LabelObjectPrintMethod | 打印方式,标签内不同段的打印方式 |
LogPrintJob | 记录打印任务,类似日志 |
NumberOfSerializedLabels | 连续打印的序列长度 |
Performance | 打印机性能 |
PrinterName | 打印机名 |
PrintToFile | 是否打印到文件中 |
PrintToFileLicense | 许可,搭配CreatePrintToFileLicense使用 |
PrintToFileName | 文件名 |
RecordRange | 从数据库调取记录范围以供引擎打印 |
ReloadTextDatabaseFields | 重载文本库 |
SelectRecordsAtPrint | 是否用户会在打印时选择打印字段 |
StartingPosition | 位置 |
SupportsIdenticalCopies | 是否支持多副本 |
SupportsSerializedLabels | 是否支持序列 |
UseDatabase | 是否使用数据库 |
Substrings类属于LabelFormatDocument类的一个成员,而Substring则是Substrings中的item
name | mean |
---|---|
Attached | 是否绑定了自动化对象 |
Detached | 是否解绑 |
Name | 数据源名称 |
Rollover | 序列化达到指定值时是否将进行翻转 |
RolloverLimit | 发生翻转的点 |
RolloverResetValue | 获取或设置序列化达到翻转限制时重新开始的值 |
SerializeBy | 获取或设置发生序列化时数据源递增或递减的间隔 |
SerializeEvery | 序列号递增或递减前,需要重复当前序列的次数 |
Type | 数据源的类型 |
Value | 数据源的值 |