ASP.NET 自定义控件1

asp.net 树型下拉框 (用户自定义控件) 利用vs2005自带的树型控件、结合div、css、javascript制作的用户自定义控件(类似dropdownlist,只不过下拉列表中用treeview 绑定数据),可实现树型结构数据的展示选择(数据增加绑定的方法在例子中)。在vs2005、vs2008中通过测试。 立即下载

ASP.NET 自定义控件1

ASP.NET自定义控件开发专题

4月16日

2009

本节将简单演示一个最基本的注册自定义控件的开发,希望读者可以对自定义控件开发有一个最基本的感性认识。

ASP.NET自定义控件开发专题1

 

ASP.NET 自定义控件1

源码下载

我学习技术讲究以实践为主、理论为辅的方式学习,以成果来激励学习的积极性。这也是我教书的一贯策略。所以在本系列所有的章节中,我都会以示例的方式来展示自定义控件开发的细节,请各位博友点评并指正。

闲话少提,转入正题。本节中,我们要完成一个如图1.1所示的用户注册控件的开发:

图1.1 设计器效果图

这个注册页面的HTML代码如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head><title>

    无标题页

</title>

<style type="text/css">

table

{

border:solid 1px blue;

width:auto;

height:auto;

font-family:黑体;

font-size:9pt;

text-align:center;

}

div

{

text-align:center;

}

</style>

</head>

<body>

<form name="form1" method="post" action="Default.aspx" id="form1">

<div>

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI1MTk2NDQzM2RkeKVXxlbRlC6kwkW0xZb24MJiHos=" />

</div>

<div>

<table>

<caption>用户注册</caption>

<tbody>

<tr>

<td>用户名:</td>

<td>

<input name="txtUserName" type="text" id="txtUserName" />

</td>

</tr>

<tr>

<td>密&nbsp;&nbsp;码:</td>

<td>

<input name="txtPassword" type="password" id="txtPassword" />

</td>

</tr>

<tr>

<td>确认密码:</td>

<td>

<input name="txtSecPassword" type="password" id="txtSecPassword" />

</td>

</tr>

<tr>

<td colspan="2">

<input type="submit" name="btnRegister" value="注册" id="btnRegister" />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<input type="reset" id="btnReset" value="重置" />

</td>

</tr>

</tbody>

</table>

</div>

 

<div>

 

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBQKhrtqbCQKl1bKzCQK1qbSRCwLcl5zHDgKGxZ2yDwScGUd5EoBIuuHJkqOSRr5qNbjG" />

</div></form>

</body>

</html>

现在我们新建自定义控件库项目来完成这个注册控件,在VS2005中选择项目类型为Windows,选择模板为Web控件库。将默认WebCustomerControl1.cs文件重命名为RegisterControl.cs。

打开RegisterControl.cs文件,我们会发现所有的自定义控件都继承与WebControl这个基类,为了生成自定义界面,首先我们复写Render方法。代码如下所示:

[DefaultProperty("Text")]

[ToolboxData("<{0}:WebCustomControl1 runat=server ID='Register1'></{0}:WebCustomControl1>")]

public class RegisterControl : WebControl

{

[Bindable(true)]

[Category("Appearance")]

[DefaultValue("")]

[Localizable(true)]

public string Text

{

get

{

String s = (String)ViewState["Text"];

return ((s == null) ? String.Empty : s);

}

 

set

{

ViewState["Text"] = value;

}

}

 

protected override void RenderContents(HtmlTextWriter output)

{

output.Write(Text);

}

protected override void Render(HtmlTextWriter writer)

{

writer.Write(@" <table><caption>用户注册</caption><tbody><tr><td>用户名:</td><td><input name='txtUserName' type='text' id='txtUserName' /></td></tr><tr><td>密&nbsp;&nbsp;码:</td><td><input name='txtPassword' type='password' id='txtPassword' /></td></tr><tr><td>确认密码:</td><td><input name='txtSecPassword' type='password' id='txtSecPassword' /></td></tr> <tr><td colspan='2'><input type='submit' name='btnRegister' value='注册' id='btnRegister' />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type='reset' id='btnReset' value='重置' /></td></tr> </tbody> </table>");

}

    }

}

注意:这里我将写好的HTML代码中所有的换行符替换为空格,将所有的双引号替换为单引号,使用HtmlTextWriter的Write()方法写出来而已。在替换换行符时,使用CTRL+F调用VS2005的查找和替换功能,使用正则表达式替换换行符。

现在我们重新生成解决方案,在当前解决方案中新建网站,为工具栏添加自定义控件引用,拖入新建的网站的Default.aspx页面。效果如图1.2所示:

图1.2 使用自定义控件的效果图

 

总结展示了一个最基本的自定义控件的开发,在我写的这个系列中将首先从这个实例出发,然后逐步深入至自定义控件开发的核心。我会给大家演示:

  • 注册控件
  • 登陆控件
  • 自定义导航
  • 人员选择控件
  • 部门选择控件
  • 父子表控件
  • 广告窗体控件
  • 联动控件

源码下载

JSP GridView --使用自定义标签实现ASP.NET的控件 NULL 博文链接:https://xianguiquan.iteye.com/blog/1323365 立即下载

相关推荐

.NET自定义控件--美化ComboBox源码

.NET自定义控件--美化ComboBox源码

ASP.NET自定义控件

起始开发ASP.NET自定义控件不是那么的高深,当初我开始学的时候还有点恐惧,但是慢慢就好了。学习控件的开发技术,并不一定说以后要从事控件的开发,而是让我们深入的理解掌握ASP.NET内部的机理。你会发觉,当 学习完控件开发技术后,你以后开发网站时有种得心应手的感觉。我不希望一上来就讲控件开始多么多么难啊,我会用一个演化的方法来讲述控件开发,一步一步帮助大家理解,如果大家要求的话,我会考虑录制视频...

liang5603的专栏 1762

asp.net自定义控件代码学习笔记

最近看了下Clingingboy写的《asp.net控件开发基础》,做些笔记。

[asp.net]自定义控件(数据绑定)

摘自:http://www.blueidea.com/bbs/NewsDetail.asp?lp=541&id=1792010数据绑定的概念是:通过提供一个DataSource属性来指定数据源,当控件呈现自己时,从数据源中抽取数据,并将这些数据作为控件的一部分进行呈现。使用的数据源一般是直接或间接实现了IEnumerable接口的数据,如ArrayList、IDataReader、Data...

weixin_30715523的博客 261

利用ASP.NET2.0创建自定义Web控件

本页内容简介自适应呈现模型创建自定义服务器控件TagKey使用自定义控件创建复合服务器控件创建复合控件添加控件行为回调示例使用设计器小结简介从使用基本的文本编辑器到创作标记页面,Web开发已经经历了一个漫长的过程。目前,集成开发环境(IDE)为开发过程中的几乎每个方面都提供了图形化表示形式。此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率。VisualStudio2005和ASP.NET2.0中的控件体系结构遵循了这些编程趋势,并且提供了可靠的、可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件。此外,ASP.NET中新的自适应呈现模型减少了编写可专门识别其目标浏

别再手动调参了!用BERTopic分析500篇论文摘要,我总结了这份超全参数调优指南

本文详细介绍了如何通过BERTopic参数调优从500篇论文摘要中挖掘高质量主题。从文档嵌入、降维到聚类,每个环节的关键参数设置都直接影响主题分析效果。文章提供了学术文本特有的调优技巧,包括预处理、主题多样性与专注度的平衡,以及评估指标与迭代优化方法,帮助研究者高效完成NLP主题分析任务。

weixin_31235909的博客 214

ASP.NET自定义控件开发示例(一)

本文通过实现一个服务端控件来讲解一下控件开发,该控件的功能如下:1.显示服务端时间,并不停更新 2.通过手动点击刷新按钮以AJAX获取服务端最新时间 3.能拖动 4.能记住在页面上的位置,页面回传后位置不变 5.能配置一个定时时间,一到这个时间,自动回传触发用户自定义的事件 首先新建一个类库项目HampWebControl,再新建一个类叫TipTime1,继承WebControl类。如果不是从已...

weixin_34357887的博客 277

车载监控系统升级指南:如何用XS9950A替换TP9950实现高清视频解码(附配置代码)

本文提供了从TP9950升级至XS9950A车载视频解码芯片的完整实战指南。详细解析了硬件设计调整、PCB布局要点,并重点分享了通过I2C配置寄存器实现高清HDCCTV视频解码与同轴音频集成的软件驱动代码与调试技巧,助力工程师平滑完成系统升级。

weixin_29268637的博客 364

asp.net 自定义控件(2种方法)

一、在类中写自定义控件 自定义DropDownList: 1,首先创建一个cs类文件Controls(采用工厂模式) using System.Collections.Generic; using System.Text; using System; using System.IO; using System.Drawing; using System.Data; using S

anihasiyou的专栏 3977

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 490

从零构建:如何在VSCode中为HBuilderX迁移的UniApp项目搭建TypeScript支持环境

本文详细指导如何将HBuilderX中的UniApp项目迁移至VSCode并搭建TypeScript支持环境。通过pnpm包管理器初始化项目、配置tsconfig.json和vite.config.ts文件,实现工程化迁移与TypeScript深度集成,提升开发效率和代码质量。

book8的博客 1050

使用Javascript,CSS和Ajax创建ASP.NET自定义控件

在MSDN上看到的文章,原文名称为Who Is Looking: Building a Custom ASP.NET Control that uses Javascript, Cascading Style Sheets, and Ajax,下载以后经过测试,感觉确实不错,下面根据我的理解整理了一下其实现的思路,推荐给大家。 命如其名,这个控件的...

weixin_33696822的博客 209

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

创建ASP.NET WEB自定义控件——例程1

创建ASP.NET WEB自定义控件——例程1作者:顾庆岗 prettywolf@vip.sina.comWEB自定义控件编程是ASP.NET编程里面比较难的一部分,尤其是复杂的控件需要用到平常不常用的一些技术技巧。下面根据一些我自己的实践经验,向读者介绍一下这方面的技术。简单的继承控件:ConfirmButton我们在用ASP.NET编写应用程序的时候,经常需要在按钮提交的时

大毛的专栏 1632

uniapp [安卓苹果App端] - errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002)Uniapp真机运行APP网络请求报错失败排查

uniapp真机运行APP,网络请求报错errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002),uni.request网路请求报错,uniApp解决请求接口报错,uniapp app端打包上线后请求报错,真机运行测试请求失败,uniapp安卓app请求报错,uniapp苹果ios平台网络请求报错,uniapp真机预览请求失败怎么办,不是跨域问题,在H5中请求可以正常发送和接收,但在真机APP上请求报错,Hbuilder真机运行app网络请求报错,全

🏆 前端领域优质创作者 3087

群无人机航迹规划-虚拟管道

图源北理工全权老师团队虚拟管道相关论文,文字为个人理解,以ppt形式分享报告。

coldmood77的博客 669

ASP.NET自定义控件开发(1)

1. 自定义控件从WebControl类而不是从Control类派生而来,那么就能够继承到许多附加的属性。     比如高度,宽度,字体和其他样式相关的属性。这些属性可以允许页面开发者自定义控件的外观。当从WebControl类中派生时,应该遵循如下约定:   ◎ 包含一个到System.Web.UI.WebControls命名空间的引用。   ◎ 不要通过重载Render方法来直接向外输出流中写

sytWeibo的专栏 773

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

来自asp.net快速入门教程 自定义控件(1)

来自asp.net快速入门教程的自定义控件目录1。控件的生成逻辑2。开发复合控件3。在复合控件中处理事件4。从复合控件中引发自定义事件5。维护状态 6。开发处理回发数据的自定义(非复合)控件 7。为自定义回发生成客户端 JavaScrip -----------------------------------------------------------------------------

Alinker 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ASP.NET2.0自定义控件开发(1)----呈现控件的外观

asp.net本身提供了很多控件,可以给我们这些懒人使用,但是我们"身在福中不知福",还要更懒一点.那么,我们要更懒的话,就得要开发一些自定义控件了.举个真实例子说吧,你在WebForm中添加一个Label控件和TextBox控件来显示你想要的东东,但你觉得这样需要拖两个控件,有点累,若你想只要拖一个控件就行的话,那么就需要开发一些自定义控件.本系列文章就以LabelTextBox

knownchen的专栏 690

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

没有App_Code,如何使用ASP.NET控件?

ASP.NET1.0和ASP.NET1.1没有App_Code功能,使用自己定义的控件时,需要@Register 指令:<%@ Register TagPrefix="WebApp" Namespace="WebApplication1" Assembly = "WebApplication1" %>然后在页面中使用:<WebApp:myControl runat="server...

weixin_30760895的博客 71
上一篇: SQL Server 2005 数据库复制
下一篇: AjaxPro实现二级联动
fancy050821
博客等级 码龄19年 5粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值