ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vb.net DataGridView 下拉框应用:TaoToken 统一 Key 接入与本地验证

vb.net DataGridView 下拉框应用:TaoToken 统一 Key 接入与本地验证 1. VB.NET DataGridView 下拉框到底能做什么适合谁用如果你正在用 VB.NET 写 WinForms 桌面程序大概率绕不开 DataGridView 这个控件。它像一张可以编辑的 Excel 表格而其中的下拉框列DataGridViewComboBoxColumn就是让用户从固定选项里挑一个值而不是手打。典型场景比如订单表里选「支付方式」、员工表里选「部门」、配置表里选「模型名称」。手打容易写错下拉框能保证数据干净。但很多人卡在三个地方一是下拉框列绑定了 DataTable 之后单元格里显示的是 value 而不是 name二是点一下单元格下拉框不自动展开要再点一次小箭头三是编辑完取值时Cells(1).Value报错或者拿到的是旧值。这篇就围绕 VB.NET DataGridView 下拉框应用把列配置、数据源绑定、取值时机讲透同时结合 TaoToken 统一 Key 接入让下拉框里选中的模型名直接驱动一次 API 调用形成「选模型 → 发请求 → 看返回」的完整闭环。适合谁看有 VB.NET 基础、写过 WinForms 但被 DataGridViewComboBoxColumn 折磨过的开发者想给桌面工具加一个「模型选择」下拉、又不想每个模型单独配 Key 的人。TaoToken 在这里的角色是统一 API 通道一个 Key 就能调不同模型省去在代码里维护多套地址和密钥。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 注意这个不带 UTM。我试过把下拉框的选项直接做成模型列表用户选完点按钮就发请求整个流程在本地就能验证通不通。下面从环境准备开始一步步来。2. TaoToken 前置准备拿统一 Key 与确认 Base URL在写代码之前先把「钥匙」和「门牌号」准备好。TaoToken 提供的是统一 API 通道你不需要为每个模型单独申请账号一个 Key 走天下。这一步不涉及任何网络工具就是正常的网页操作。首先打开控制台创建 API Key。访问 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 登录后进入 API Keys 页面点新建复制那串以sk-开头的字符串。这个 Key 只显示一次建议先粘到记事本里。如果你还没注册从官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进就行。接着确认两个地址后面代码里要用用途地址说明API 根地址https://taotoken.net/api不带 UTM代码里写这个模型对话页https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content用来查可用模型名接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content请求格式参考模型名Model ID必须写对否则请求会返回模型不存在的错误。你可以去模型对话页看看当前支持的模型列表把想用的名字记下来比如常见的对话模型 ID。这个 ID 会作为下拉框的 value显示名作为 name正好对应 DataGridViewComboBoxColumn 的 ValueMember 和 DisplayMember。注意Key 不要硬编码在提交到版本库的代码里。本地验证阶段可以先放常量正式项目建议读配置文件或环境变量。本文为了演示直观写在模块级常量中你复制时记得替换成自己的。环境方面Visual Studio 2019 或 2022 都行新建一个 Windows Forms App (.NET Framework) 项目目标框架 .NET Framework 4.7.2 以上。需要引用System.Net.Http和Newtonsoft.Json用 NuGet 装。如果你用 .NET 6 的 WinFormsHttpClient 和 System.Text.Json 也完全可以思路一样。3. 可复制配置下拉框列绑定与 API 请求代码这一节是核心把 DataGridViewComboBoxColumn 的创建、数据绑定、取值以及调用 TaoToken 的代码全部给出来。你可以直接建一个 Form1把下面代码贴进去改改就能跑。先定义模型数据源。实际项目里可以从数据库读这里用内存 DataTable 模拟字段就两个value模型 ID和 name显示名。Imports System.Data Imports System.Net.Http Imports System.Text Imports Newtonsoft.Json.Linq Public Class Form1 TaoToken 统一 Key替换成你自己的 Private Const TAOTOKEN_API_KEY As String sk-你的Key API 根地址注意不带 UTM Private Const TAOTOKEN_BASE_URL As String https://taotoken.net/api 下拉框数据源value 是模型 IDname 是显示名 Private Function GetModelComboData() As DataTable Dim dt As New DataTable() dt.Columns.Add(value, GetType(String)) dt.Columns.Add(name, GetType(String)) dt.Rows.Add(gpt-4o-mini, GPT-4o mini) dt.Rows.Add(claude-3-5-sonnet, Claude 3.5 Sonnet) dt.Rows.Add(deepseek-chat, DeepSeek Chat) Return dt End Function 表格数据源第二列存模型 ID Private Function GetGridData() As DataTable Dim dt As New DataTable() dt.Columns.Add(Id, GetType(Integer)) dt.Columns.Add(ModelId, GetType(String)) dt.Columns.Add(Prompt, GetType(String)) dt.Rows.Add(1, gpt-4o-mini, 用一句话解释什么是委托) dt.Rows.Add(2, deepseek-chat, 写一个 VB.NET 冒泡排序) Return dt End Function然后是窗体加载时创建下拉框列并绑定。关键点AutoGenerateColumns False否则自动生成的列会和你手动加的冲突ValueMember和DisplayMember分别指向 DataTable 的 value 和 name插入位置用Columns.Insert。Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DataGridView1.AutoGenerateColumns False 先加普通文本列 Dim colId As New DataGridViewTextBoxColumn() colId.HeaderText 编号 colId.DataPropertyName Id colId.Name colId DataGridView1.Columns.Add(colId) 创建下拉框列 Dim cmbCol As New DataGridViewComboBoxColumn() cmbCol.HeaderText 模型 cmbCol.Name comboxColumn cmbCol.ValueMember value cmbCol.DisplayMember name cmbCol.DataSource GetModelComboData() cmbCol.DisplayStyle DataGridViewComboBoxDisplayStyle.ComboBox cmbCol.DisplayStyleForCurrentCellOnly True cmbCol.FlatStyle FlatStyle.Flat DataGridView1.Columns.Insert(1, cmbCol) 再加提示词列 Dim colPrompt As New DataGridViewTextBoxColumn() colPrompt.HeaderText 提示词 colPrompt.DataPropertyName Prompt colPrompt.Name colPrompt DataGridView1.Columns.Add(colPrompt) 绑定表格数据 Dim gridData As DataTable GetGridData() DataGridView1.DataSource gridData 根据数据里的 ModelId 设置下拉框选中项 For i As Integer 0 To gridData.Rows.Count - 1 DataGridView1.Rows(i).Cells(comboxColumn).Value gridData.Rows(i)(ModelId).ToString() Next End Sub这里有个坑如果 DataTable 里某行的 ModelId 不在下拉框数据源的 value 列表里赋值会抛DataError。稳妥做法是赋值前判断一下或者处理DataError事件把错误吞掉并提示。下面第 5 节会专门讲。接下来是「点一次就展开下拉框」的处理。默认要双击或点小箭头用CellEnter事件发 F4 键即可。Private Sub DataGridView1_CellEnter(sender As Object, e As DataGridViewCellEventArgs) _ Handles DataGridView1.CellEnter Dim dgv As DataGridView CType(sender, DataGridView) If e.ColumnIndex 0 AndAlso dgv.Columns(e.ColumnIndex).Name comboxColumn Then SendKeys.Send({F4}) End If End Sub取值时机很重要。编辑中的值要用EditingControl拿编辑完成后的值用FormattedValue拿。下面这个按钮点击后读取当前行选中的模型 ID 和显示名然后调用 TaoToken。Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If DataGridView1.CurrentRow Is Nothing Then Return Dim modelId As String DataGridView1.CurrentRow.Cells(comboxColumn).Value?.ToString() Dim prompt As String DataGridView1.CurrentRow.Cells(colPrompt).Value?.ToString() If String.IsNullOrEmpty(modelId) OrElse String.IsNullOrEmpty(prompt) Then MessageBox.Show(请先选择模型并填写提示词) Return End If Button1.Enabled False Try Dim reply As String Await CallTaoTokenAsync(modelId, prompt) MessageBox.Show(reply, 模型返回) Catch ex As Exception MessageBox.Show(请求失败 ex.Message) Finally Button1.Enabled True End Try End Sub Private Async Function CallTaoTokenAsync(modelId As String, prompt As String) As Task(Of String) Using client As New HttpClient() client.DefaultRequestHeaders.Add(Authorization, Bearer TAOTOKEN_API_KEY) Dim payload As New JObject() payload(model) modelId payload(messages) New JArray( New JObject(New JProperty(role, user), New JProperty(content, prompt)) ) Dim content As New StringContent(payload.ToString(), Encoding.UTF8, application/json) Dim resp As HttpResponseMessage Await client.PostAsync(TAOTOKEN_BASE_URL /v1/chat/completions, content) Dim body As String Await resp.Content.ReadAsStringAsync() If Not resp.IsSuccessStatusCode Then Throw New Exception(HTTP CInt(resp.StatusCode) body) End If Dim json As JObject JObject.Parse(body) Return json(choices)(0)(message)(content).ToString() End Using End Function注意CallTaoTokenAsync里用的是TAOTOKEN_BASE_URL /v1/chat/completions这是 OpenAI 兼容格式。如果你的模型 ID 是 Claude 系列TaoToken 同样走这个兼容端点不用改路径。三件套记牢Base URL 是https://taotoken.net/apiKey 是sk-开头那串Model ID 是下拉框的 value。4. 验证请求下拉选项加载与返回结果确认代码写完先别急着接真实业务分两步验证先确认下拉框选项正常加载再确认 API 请求能返回。第一步运行程序。窗体加载后DataGridView 第二列应该显示成下拉框并且每行已经根据 ModelId 选中了对应项。点一下单元格下拉列表自动展开F4 生效能看到三个模型名。如果显示的是gpt-4o-mini这种 value 而不是GPT-4o mini说明DisplayMember没生效检查是不是漏了cmbCol.DisplayMember name或者 DataTable 列名拼错。第二步选中第一行提示词已经预填了「用一句话解释什么是委托」点按钮。程序会禁用按钮、发请求、弹窗显示返回内容。正常返回类似「委托是一种类型安全的函数指针……」。如果弹窗显示「请求失败HTTP 401」说明 Key 不对或没带Bearer前缀如果显示「HTTP 404」多半是模型 ID 写错去模型对话页核对。为了更直观地看请求过程可以在CallTaoTokenAsync里加一行日志把payload.ToString()和body输出到Debug.WriteLine在 VS 的输出窗口看。这样你能确认发出去的 JSON 长什么样返回的原始结构是什么。提示验证阶段建议先用gpt-4o-mini这类响应快的模型减少等待。等流程通了再换其他模型。如果你想把验证做得更细可以单独写一个控制台小测试不依赖窗体直接调CallTaoTokenAsync。这样能排除 DataGridView 的干扰确认是网络层还是 UI 层的问题。实测下来大部分「请求失败」都是 Key 或模型 ID 的问题跟下拉框本身无关。另外下拉框的DataSource如果是动态从数据库加载的记得在加载完成后再赋值给cmbCol.DataSource不要在Form_Load里异步还没回来就赋值否则下拉列表是空的。可以用Await等数据回来再绑定或者用BindingList做数据绑定。5. 本篇常见错排查401、DataError、取值报错怎么解这一节把最容易踩的坑列出来对照报错找原因。报错一HTTP 401 Unauthorized。返回体通常是{error:{message:Invalid API key}}。原因有三种Key 复制时带了空格请求头没写Bearer前缀Key 已失效。检查client.DefaultRequestHeaders.Add(Authorization, Bearer TAOTOKEN_API_KEY)这行确认Bearer后面有一个空格。如果 Key 是从网页复制的注意别把换行符带进去用Trim()处理一下。报错二DataGridViewComboBoxCell 值无效。弹窗提示「DataGridViewComboBoxCell 的值无效」或者触发DataError事件。这是因为你给单元格赋的 value 不在下拉框 DataSource 的 ValueMember 列表里。比如表格数据里 ModelId 是gpt-4但下拉框只列了gpt-4o-mini。解决办法赋值前判断或者处理DataError事件。Private Sub DataGridView1_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) _ Handles DataGridView1.DataError 下拉框值不在列表时忽略错误避免弹窗 If e.ColumnIndex DataGridView1.Columns(comboxColumn).Index Then e.ThrowException False End If End Sub报错三取值时Cells(1).Value报错或拿到旧值。编辑中的单元格Value可能还没提交。正确做法是用EditedFormattedValue拿编辑中的显示值用FormattedValue拿提交后的显示值。如果你在SelectedIndexChanged里取值要用DataGridViewComboBoxEditingControl的SelectedValue而不是直接读单元格。Private Sub DataGridView1_EditingControlShowing(sender As Object, _ e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then Dim cmb As DataGridViewComboBoxEditingControl CType(e.Control, DataGridViewComboBoxEditingControl) RemoveHandler cmb.SelectedIndexChanged, AddressOf Cmb_SelectedIndexChanged AddHandler cmb.SelectedIndexChanged, AddressOf Cmb_SelectedIndexChanged End If End Sub Private Sub Cmb_SelectedIndexChanged(sender As Object, e As EventArgs) Dim cmb As DataGridViewComboBoxEditingControl CType(sender, DataGridViewComboBoxEditingControl) Debug.WriteLine(选中的 value cmb.SelectedValue?.ToString()) End Sub报错四local proxy failed 或连接超时。这个报错说明请求根本没到 TaoToken 服务器通常是本机网络配置或防火墙拦截。检查TAOTOKEN_BASE_URL是不是写成了https://taotoken.net/api有没有多写斜杠或少了https。如果你在公司内网确认防火墙允许出站 443 端口。这个错误跟代码无关先排除网络。报错五reading choices 时 NullReferenceException。说明返回的 JSON 里没有choices字段通常是请求体格式不对或者模型返回了错误结构。打印body看原始返回如果是{error:...}按错误信息处理如果choices存在但为空数组说明模型没返回内容检查messages格式。报错六OAuth 相关错误。如果你误用了需要 OAuth 的端点会提示认证方式不对。TaoToken 的 API 用 Bearer Token 即可不需要 OAuth 流程。确认你调的是/v1/chat/completions而不是其他需要额外授权的路径。把上面这些对照一遍基本能覆盖 90% 的问题。剩下的 10% 多半是模型 ID 拼写或账户额度问题去控制台看看用量就知道了。6. 把下拉框选中的模型接到真实业务里流程跑通之后你可以把「选模型」这个动作做得更顺。比如在下拉框的SelectedIndexChanged里实时切换提示词模板或者根据选中的模型动态调整请求参数有的模型支持temperature有的默认就好。DataGridView 的下拉框列本身不直接暴露SelectedIndexChanged需要像上面那样通过EditingControlShowing挂事件或者用CellValueChanged在提交后处理。另一个实用技巧把模型列表做成可配置的从 TaoToken 的模型对话页拿到最新列表后存到本地 JSON程序启动时读进来填充下拉框。这样新增模型不用改代码。读取 JSON 用Newtonsoft.Json几行就搞定然后DataTable的Rows.Add循环填进去。如果你要做的是长期运行的编码助手或 Agent 类工具建议了解一下 Coding Plan它更适合持续调用场景入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。普通的一次性验证用 API Keys 就够了地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 遇到请求格式问题先翻文档。最后提醒一句DataGridView 的下拉框在数据量大时会有性能问题几千行以上建议用虚拟模式VirtualMode或者把下拉框换成点击弹窗选择。这个跟 TaoToken 无关是 WinForms 本身的特性。先把本文的流程跑通再根据你的数据量决定要不要优化。
返回列表