Ext cookies设置、获取和清除

博客主要介绍了Cookies的设置、获取和清除操作,还推荐参考运用JS设置、读取和删除Cookie的相关内容,聚焦于利用JS对Cookies进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cookies设置: 

Ext.util.Cookies.set("a1",encodeURI(resp.list[0].aa));
Ext.util.Cookies.set("b1","bb");
Ext.util.Cookies.set("c1",encodeURI("汉字"));
Ext.util.Cookies.set("d1",encodeURI(resp.list[0].V_LOGINNAME));

cookies获取:

decodeURI(Ext.util.Cookies.get("a1")); //汉字获取
Ext.util.Cookies.get("b1"); //字符获取
decodeURI(Ext.util.Cookies.get("c1")); 
decodeURI(Ext.util.Cookies.get("d1"));

cookies清除:

function clearAllCookie() {
    var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
    if(keys) {
        for(var i = keys.length; i--;) {Ext.util.Cookies.set(keys[i],"")}

    }
}

推荐参考:运用JS设置cookie、读取cookie、删除cookie

给你代码你看一下,再决定,urils.py的import time import requests import json import math import random import typing class XHS_Splier_utils(): def __init__(self): self.URL="https://edith.xiaohongshu.com" self.JS_DOM_APTH=r"D:\lws_tanchen\project\tanchen_py_dy\tanchen_data_analysis\core\Crawler\xhs_crawler\node_modules\jsdom\lib" def search_generate_x_b3_traceid(self,len=16): x_b3_traceid = "" for t in range(len): x_b3_traceid += "abcdef0123456789"[math.floor(16 * random.random())] return x_b3_traceid def search_trans_cookies(self,cookies_str:str): if '; ' in cookies_str: ck = {i.split('=')[0]: '='.join(i.split('=')[1:]) for i in cookies_str.split('; ')} else: ck = {i.split('=')[0]: '='.join(i.split('=')[1:]) for i in cookies_str.split(';')} return ck def search_generate_xs_xs_common(self,a1, api, data=''): import execjs """ execjs 是一个 允许在 Python 环境中执行 JavaScript 代码 pip install PyExecJS==1.5.1 """ try: with open('./static/xhs_xs_xsc_56.js', 'r', encoding='utf-8') as f: js_code = f.read() js = execjs.compile(js_code, cwd=self.JS_DOM_APTH) except Exception as e: with open('./static/xhs_xs_xsc_56.js', 'r', encoding='utf-8') as f: js_code = f.read() js = execjs.compile(js_code, cwd=self.JS_DOM_APTH) ret = js.call('get_request_headers_params', api, data, a1) xs, xt, xs_common = ret['xs'], ret['xt'], ret['xs_common'] return xs, xt, xs_common def search_generate_xray_traceid(self): import execjs try: # 读取 JS 文件 with open('./static/xhs_xray.js', 'r', encoding='utf-8') as f: js_code = f.read() xray_js = execjs.compile(js_code, cwd=self.JS_DOM_APTH) except Exception as e: with open('../static/xhs_xray.js', 'r', encoding='utf-8') as f: js_code = f.read() xray_js = execjs.compile(js_code, cwd=self.JS_DOM_APTH) return xray_js.call('traceId') def search_get_request_headers_template(self): return { "authority": "edith.xiaohongshu.com", "accept": "application/json, text/plain, */*", "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "cache-control": "no-cache", "content-type": "application/json;charset=UTF-8", "origin": "https://www.xiaohongshu.com", "pragma": "no-cache", "referer": "https://www.xiaohongshu.com/", "sec-ch-ua": "\"Not A(Brand\";v=\"99\", \"Microsoft Edge\";v=\"121\", \"Chromium\";v=\"121\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0", "x-b3-traceid": "", "x-mns": "unload", "x-s": "", "x-s-common": "", "x-t": "", "x-xray-traceid": self.search_generate_xray_traceid() } def search_generate_headers(self,a1, api, data): xs, xt, xs_common = self.search_generate_xs_xs_common(a1, api, data) x_b3_traceid = self.search_generate_x_b3_traceid() headers = self.search_get_request_headers_template() headers['x-s'] = xs headers['x-t'] = str(xt) headers['x-s-common'] = xs_common headers['x-b3-traceid'] = x_b3_traceid if data: data = json.dumps(data, separators=(',', ':'), ensure_ascii=False) return headers, data def search_generate_request_params(self,cookies_str:str,api:str,data): cookies = self.search_trans_cookies(cookies_str) a1 = cookies['a1'] headers, data = self.search_generate_headers(a1, api, data) return headers, cookies, data def single_search_api(self,query:str,cookies_str:str,page:int=1,sort_type_choice:int=0,note_type:int=0,note_time:int=0,note_range:int=0,pos_distance:int=0,geo:str=None,proxies: dict = None): """ 获取搜索笔记的结果 :param query 搜索的关键词 :param cookies_str 你的cookies :param page 搜索的页数 :param sort_type_choice 排序方式 0 综合排序, 1 最新, 2 最多点赞, 3 最多评论, 4 最多收藏 :param note_type 笔记类型 0 不限, 1 视频笔记, 2 普通笔记 :param note_time 笔记时间 0 不限, 1 一天内, 2 一周内天, 3 半年内 :param note_range 笔记范围 0 不限, 1 已看过, 2 未看过, 3 已关注 :param pos_distance 位置距离 0 不限, 1 同城, 2 附近 指定这个必须要指定 geo :param geo = "{ # # 经纬度 # "latitude": 39.9725, # "longitude": 116.4207 # }" str类型 :param proxies={ "http":"", "https":"" }dict类型 返回搜索的结果 """ res_json = None sort_type = "general" if sort_type_choice == 1: sort_type = "time_descending" elif sort_type_choice == 2: sort_type = "popularity_descending" elif sort_type_choice == 3: sort_type = "comment_descending" elif sort_type_choice == 4: sort_type = "collect_descending" filter_note_type = "不限" if note_type == 1: filter_note_type = "视频笔记" elif note_type == 2: filter_note_type = "普通笔记" filter_note_time = "不限" if note_time == 1: filter_note_time = "一天内" elif note_time == 2: filter_note_time = "一周内" elif note_time == 3: filter_note_time = "半年内" filter_note_range = "不限" if note_range == 1: filter_note_range = "已看过" elif note_range == 2: filter_note_range = "未看过" elif note_range == 3: filter_note_range = "已关注" filter_pos_distance = "不限" if pos_distance == 1: filter_pos_distance = "同城" elif pos_distance == 2: filter_pos_distance = "附近" if geo: geo = json.dumps(geo, separators=(',', ':')) try: """ query = "榴莲" query_num = 10 sort_type_choice = 0 # 0 综合排序, 1 最新, 2 最多点赞, 3 最多评论, 4 最多收藏 note_type = 0 # 0 不限, 1 视频笔记, 2 普通笔记 note_time = 0 # 0 不限, 1 一天内, 2 一周内天, 3 半年内 note_range = 0 # 0 不限, 1 已看过, 2 未看过, 3 已关注 pos_distance = 0 # 0 不限, 1 同城, 2 附近 指定这个1或2必须要指定 geo # geo = { # # 经纬度 # "latitude": 39.9725, # "longitude": 116.4207 # } """ api="/api/sns/web/v1/search/notes" data = { "keyword": query, "page": page, "page_size": 20, "search_id": self.search_generate_x_b3_traceid(21), "sort": "general", "note_type": 0, "ext_flags": [], "filters": [ { "tags": [ sort_type ], "type": "sort_type" }, { "tags": [ filter_note_type ], "type": "filter_note_type" }, { "tags": [ filter_note_time ], "type": "filter_note_time" }, { "tags": [ filter_note_range ], "type": "filter_note_range" }, { "tags": [ filter_pos_distance ], "type": "filter_pos_distance" } ], "geo": geo, "image_formats": [ "jpg", "webp", "avif" ] } headers, cookies, data = self.search_generate_request_params(cookies_str,api,data) response=requests.post(url=self.URL+api,headers=headers,data=data.encode("utf-8"),cookies=cookies,proxies=proxies) res_json=response.json() success,msg=res_json["success"],res_json["msg"] except Exception as e: success=False msg=str(e) return success,msg,res_json def all_search_api(self, query: str, cookies_str: str, require_num: int=500,sort_type_choice=0, note_type=0, note_time=0, note_range=0, pos_distance=0, geo="", proxies: dict = None): """ 指定数量搜索笔记,设置排序方式笔记类型笔记数量 PC端爬虫最多也就200多条,默认设置获取500条 设置一个随机延迟时间,不要搞那么快,可以手动调节范围,或者取消 :param query 搜索的关键词 :param require_num 搜索的数量默认500条 :param cookies_str 你的cookies :param sort_type_choice 排序方式 0 综合排序, 1 最新, 2 最多点赞, 3 最多评论, 4 最多收藏 :param note_type 笔记类型 0 不限, 1 视频笔记, 2 普通笔记 :param note_time 笔记时间 0 不限, 1 一天内, 2 一周内天, 3 半年内 :param note_range 笔记范围 0 不限, 1 已看过, 2 未看过, 3 已关注 :param pos_distance 位置距离 0 不限, 1 同城, 2 附近 指定这个必须要指定 geo :param geo: 定位信息 经纬度 返回搜索的结果 """ page = 1 note_list = [] try: while True: success, msg, res_json = self.single_search_api(query, cookies_str, page, sort_type_choice, note_type, note_time, note_range, pos_distance, geo, proxies) if not success: raise Exception(msg) if "items" not in res_json["data"]: break notes = res_json["data"]["items"] note_list.extend(notes) page += 1 if len(note_list) >= require_num or not res_json["data"]["has_more"]: break print("note_list",note_list) #time.sleep(random.randint(1,5)) except Exception as e: success = False msg = str(e) if len(note_list) > require_num: note_list = note_list[:require_num] return success, msg, note_list COOKIES='abRequestId=0ce8e19f-c357-5b21-a435-349316627ab2; a1=19777a5b680yiog7y6vwx1erczenf5aup16obr46u50000367007; webId=167052dbe181764057d527bed85d8ae8; gid=yjWWW02SYJU2yjWWW02DKyF4Y8v3lkWvKhECKK7ydFSudl28Ii207D888qKW88W80yDD88y2; xsecappid=xhs-pc-web; webBuild=4.72.0; web_session=040069b24a794e37836707ee413a4b6f92710c; unread={%22ub%22:%22686e4bfe000000000b01d57c%22%2C%22ue%22:%226862b458000000001c034d32%22%2C%22uc%22:27}; acw_tc=0ad583f417524771866795359e8c06b0dd25f3e6eb69b5f2e090ce575d9b27; websectiga=3633fe24d49c7dd0eb923edc8205740f10fdb18b25d424d2a2322c6196d2a4ad; sec_poison_id=18be10d8-a62f-4f6b-a4cf-3c734e2af7d0; loadts=1752477207049' # success, msg, notes=XHS_Splier_utils().single_search_api(query="榴莲",cookies_str=COOKIES) # print(notes) success, msg, notes=XHS_Splier_utils().all_search_api(query="榴莲",cookies_str=COOKIES) print("notes",notes) print("长度",len(notes)),xhs_creator_xs.js的代码片段const crypto = require('crypto'); let key = 'glt6h61ta7kisow7' let iv = '4hrivgw5s342f9b2' key = Buffer.from(key); iv = Buffer.from(iv);下面都是函数调用,xhs_xray.js的self = global; window = global; var zc666;下面也都是函数调用,xhs_xray_pack1.js的内容(self.webpackChunkxhs_pc_web = self.webpackChunkxhs_pc_web || []).push([[861], {}),xhs_xray_pack2.js的内容(self.webpackChunkxhs_pc_web = self.webpackChunkxhs_pc_web || []).push([[121], {}),xhs_xs_xsc_56.js的const jsdom = require("jsdom"); const { JSDOM } = jsdom; const html = "<!DOCTYPE html><p></p>"; const resourceLoader = new jsdom.ResourceLoader({ userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", }); const dom = new JSDOM(html,{ url: "https://www.xiaohongshu.com", referrer: "https://www.xiaohongshu.com", contentType: "text/html", resources: resourceLoader, }) window = dom.window; document = window.document; // DOMParser = window.DOMParser; // location = window.location; // navigator = window.navigator; // localStorage = window.localStorage; // class AudioContextMock { // constructor() { // } // } // class webkitAudioContextMock { // constructor() { // } // } // var indexedDB = {} // var canvas = { // toDataURL: function toDataURL() { // }, // getContext: function getContext(x) { // } // }; window.document.cookie = "a1=1927f6098768njq4co9jqukn0qtc8irx7u3ixrnxs50000565146;" // history = {} // Image = function () { // // } // PluginArray = function () { // // } // indexedDB = function () { // // } // WebSocket = function () { // // } var esm_typeof = { Z: function (t) { return typeof t; }, };var r=[],还有个node_modules下面有个jsdom文件夹
07-18
<think>我们正在讨论Ext JS中Grid的列对象操作。根据用户的问题,他想要获取Grid的列对象并设置为只读。 在Ext JS中,Grid的列配置通常包含在列模型(ColumnModel)中。我们可以通过Grid的列模型来获取列对象,然后修改列的配置属性以实现只读。 注意:在Ext JS中,列的只读通常是通过禁用该列的编辑器(如果使用了可编辑的Grid)或者通过设置列的readOnly配置项(如果该列支持)来实现的。但是,标准的Ext JS Grid列本身并没有一个直接的readOnly配置项。对于可编辑的Grid,我们通常是在列的编辑器(editor)上设置readOnly属性。而对于非编辑状态,我们可能需要通过其他方式(如CSS或事件拦截)来防止编辑。 然而,用户的问题中提到了“列对象”“只读”,所以我们可以考虑两种情况: 1. 如果Grid是可编辑的(使用CellEditing或RowEditing插件),则可以通过设置编辑器的readOnly属性来使某一列只读。 2. 如果希望整个列都不可编辑,包括不显示编辑器,那么可能需要设置列的editor配置为null,或者通过其他方式禁止编辑。 但是,用户要求的是获取列对象并设置为只读。因此,我们需要先获取列对象,然后修改其配置。 然而,需要注意的是,在Ext JS中,列模型(ColumnModel)中的列配置在Grid初始化后通常是固定的,直接修改列配置可能不会立即生效,需要重新刷新视图或重新配置Grid。 但是,Ext JS提供了动态修改列配置的方法。我们可以通过列模型的方法来修改列的配置。 参考引用[1]中提到了Ext.NET(一个Ext JS的.NET封装)中的列类型,但用户的问题是关于Ext JS的,所以我们主要关注Ext JS本身。 另外,引用[2][3]提供了一些关于Grid单元格样式的设置获取行数据的方法,但与我们当前的问题关系不大。 因此,我们尝试给出在Ext JS中实现的方法: 步骤1:获取Grid的列模型(ColumnModel)。在Ext JS 3.x中,我们可以通过grid.getColumnModel()方法获取。在Ext JS 4及更高版本中,列模型是作为Grid的headerCt(一个Container)的一部分,但我们可以通过grid.columns或grid.columnManager来获取列。 这里我们以Ext JS 3.x为例(因为引用中提到了3.x),但也会简要说明Ext JS 4+。 **Ext JS 3.x:** 假设我们有一个GridPanel实例`grid`,我们可以通过以下方式获取列模型: ```javascript var colModel = grid.getColumnModel(); ``` 步骤2:获取特定的列对象。列模型是一个列配置对象的集合。我们可以通过列的索引(index)或id(如果配置了id)来获取列配置对象。 ```javascript // 通过索引获取列配置对象 var columnIndex = 0; // 假设我们要操作第一列 var columnConfig = colModel.getColumnAt(columnIndex); ``` 步骤3:修改列的配置以实现只读。在可编辑的Grid中,我们通常关注的是列的编辑器(editor)配置。我们可以将编辑器设置为禁用(readOnly)或者直接移除编辑器(这样就不能编辑了)。 ```javascript // 如果列配置中有editor,我们可以将其设置为只读 if (columnConfig.editor) { // 如果editor是一个配置对象,我们需要先获取编辑器实例?但注意,在Ext JS 3.x中,编辑器在编辑时才会创建。 // 因此,我们可能需要修改配置,以便在下次创建编辑器时应用readOnly,或者我们可以在编辑器创建后设置。 // 但是,直接修改配置可能不会影响已经创建的编辑器,所以我们需要考虑在编辑前设置。 // 方法1:修改配置,这样新创建的编辑器就会是只读的 columnConfig.editor = Ext.apply(columnConfig.editor || {}, { readOnly: true }); // 但是,如果编辑器已经创建过,我们可能需要更新现有的编辑器实例?这通常比较困难,因为编辑器是按需创建的。 // 方法2:我们也可以禁用该列的编辑功能,通过将editor设置为null // columnConfig.editor = null; // 这样该列将不可编辑 } ``` 但是,上面的方法修改了列配置,但不会立即生效。我们需要通知Grid更新列模型。在Ext JS 3.x中,我们可以调用grid.reconfigure()方法(需要传入相同的Store新的列模型)来重新配置Grid,但这会重新渲染整个Grid,可能不是用户想要的。 另一种方法是,如果我们使用CellEditing或RowEditing插件,我们可以在开始编辑事件('beforeedit')中阻止编辑: ```javascript grid.on('beforeedit', function(editor, e) { // 如果编辑的是我们想要只读的列,则返回false取消编辑 if (e.column == columnIndex) { // 或者通过其他方式判断 return false; } }); ``` **Ext JS 4及更高版本:** 在Ext JS 4+中,我们通常通过列配置的editor属性来设置编辑器,而且我们可以动态修改列的配置。但是,同样的问题,修改配置后需要更新视图。 在Ext JS 4+中,我们可以通过以下方式获取列: ```javascript var column = grid.down('gridcolumn[dataIndex="myDataIndex"]'); // 通过dataIndex查找 // 或者 var column = grid.headerCt.getGridColumns()[index]; // 通过索引 // 然后,我们可以修改列的editor配置 column.setEditor({ // 如果之前没有editor,则设置一个禁用的editor;如果已有,则修改其readOnly属性 xtype: 'textfield', readOnly: true }); // 或者完全移除editor column.editor = null; // 这样可能不够,因为编辑插件可能已经保存了编辑器实例 // 更好的方法可能是通过编辑插件来控制 var cellEditing = grid.findPlugin('cellediting'); if (cellEditing) { cellEditing.addListener('beforeedit', function(editor, context) { if (context.column === column) { return false; // 阻止编辑 } }); } ``` 考虑到用户的问题,我们可能更倾向于使用事件拦截的方式,因为它不需要重新渲染Grid,并且可以动态控制。 因此,我们可以总结如下: 在Ext JS中,要将Grid的某一列设置为只读,可以通过以下方式之一: 1. 在列配置中,设置editor为null(这样该列将不可编辑),然后可能需要重新配置Grid(使用reconfigure方法)以使更改生效(不推荐,因为会重新渲染)。 2. 通过编辑插件的beforeedit事件,在编辑开始前根据列索引或列对象判断,如果是目标列则取消编辑。 由于用户要求获取列对象并设置,我们可以结合事件拦截的方式,因为直接设置列对象的editor属性可能不会立即生效(尤其是在Ext JS 3.x中,编辑器实例是按需创建的)。 因此,我们给出一个使用事件拦截的示例: **Ext JS 3.x 示例:** ```javascript // 假设grid是GridPanel实例 var grid = ...; // 获取列模型 var colModel = grid.getColumnModel(); // 假设我们要设置第一列为只读 var columnIndex = 0; // 监听beforeedit事件 grid.on('beforeedit', function(editor, rowIndex, colIndex, value) { // 如果编辑的是我们想要只读的列 if (colIndex === columnIndex) { return false; // 取消编辑 } return true; }); ``` **Ext JS 4+ 示例:** ```javascript // 假设grid是GridPanel实例 var grid = ...; // 获取列对象,例如通过dataIndex var column = grid.down('gridcolumn[dataIndex="myDataIndex"]'); // 获取编辑插件 var cellEditing = grid.findPlugin('cellediting'); if (cellEditing) { cellEditing.on('beforeedit', function(editor, context) { // 如果编辑的是目标列 if (context.column === column) { return false; // 取消编辑 } }); } ``` 这样,我们就实现了将Grid的列设置为只读的效果。 注意:如果用户希望的是在非编辑状态下也禁止某种操作(比如通过点击按钮或其他方式修改数据),那么可能需要更全面的控制,比如在数据存储(Store)层面进行验证,或者禁止用户输入。 以上方法仅阻止了通过Grid内置编辑插件的编辑,如果用户通过其他方式修改数据(例如,通过其他表单),则不在控制范围内。 因此,我们根据用户的问题,提供了在Ext JS中获取Grid列对象并设置为只读的方法。</think>在 Ext JS 中获取 Grid 列对象并设置为只读,可以通过以下步骤实现: ### 解决方案 1. **获取列对象** 使用 `grid.getColumnManager().getColumns()` 获取所有列对象,或通过 `dataIndex` 查找特定列: ```javascript // 获取所有列对象 const columns = grid.getColumnManager().getColumns(); // 通过 dataIndex 查找特定列 (推荐) const targetColumn = grid.down(`gridcolumn[dataIndex="your_data_index"]`); ``` 2. **设置列只读** - **方案1:禁用编辑器**(适用于可编辑 Grid) 若列已配置编辑器,直接设置编辑器的 `readOnly` 属性: ```javascript // 设置编辑器只读 if (targetColumn.editor) { targetColumn.editor.setReadOnly(true); } ``` - **方案2:拦截编辑事件**(通用方法) 通过 Grid 的编辑插件监听 `beforeedit` 事件,阻止目标列编辑: ```javascript const cellEditing = grid.findPlugin('cellediting'); cellEditing.on('beforeedit', (editor, context) => { if (context.column === targetColumn) { return false; // 阻止编辑 } }); ``` - **方案3:动态移除编辑器** 直接清除列的编辑器配置: ```javascript targetColumn.editor = null; // 禁用编辑功能 grid.reconfigure(columns); // 重新配置列 ``` ### 完整示例代码 ```javascript // 获取 Grid 组件 const grid = Ext.ComponentQuery.query('yourgridxtype')[0]; // 通过 dataIndex 查找列 (例如 "price" 列) const priceColumn = grid.down('gridcolumn[dataIndex="price"]'); // 方法1:设置编辑器只读 if (priceColumn.editor) { priceColumn.editor.setReadOnly(true); } // 方法2:通过编辑插件拦截事件 (更可靠) const cellEditing = grid.findPlugin('cellediting'); cellEditing.addListener('beforeedit', (editor, context) => { if (context.column.dataIndex === 'price') { return false; // 阻止编辑 } return true; }); ``` ### 关键说明 1. **列对象获取** - `grid.getColumnManager()` 适用于 Ext JS 6+,低版本使用 `grid.headerCt.getGridColumns()`[^1]。 - 通过 `dataIndex` 查找是最精准的方式,避免依赖列索引。 2. **只读实现原理** - 核心是控制编辑行为:通过禁用编辑器或拦截编辑事件实现[^2]。 - 修改列配置后需调用 `reconfigure()` 刷新视图(仅方案3需要)。 3. **注意事项** - 若 Grid 使用 `RowEditing` 插件,将 `cellediting` 替换为 `rowediting`。 - 只读设置不会影响数据提交逻辑,需在数据验证层额外处理[^3]。 --- ### 相关问题 1. **如何动态恢复 Ext JS Grid 列的编辑功能?** > 反向操作:设置 `editor.setReadOnly(false)` 或移除 `beforeedit` 的事件监听。 2. **Ext JS 中如何批量设置多列为只读?** > 遍历列数组,对目标列统一应用上述只读逻辑。 3. **只读列在数据提交时如何避免被修改?** > 在 Model 验证或 `beforeupdate` 事件中检查字段是否允许修改[^3]。 4. **Ext JS 7 中是否有更简洁的只读列实现方式?** > 新版可通过 `column.setConfig({ editor: null })` 直接禁用编辑,无需 `reconfigure()`。 [^1]: Ext.NET 列类型文档说明。 [^2]: 单元格编辑事件拦截与样式控制方法。 [^3]: Grid 数据提交时的字段过滤与验证机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值