C# Web控件与数据感应之 CheckBoxList 类

简介: C# Web控件与数据感应之 CheckBoxList 类

关于数据感应

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,本文将继续介绍与数据库提取数据并捆绑到 CheckBoxList 类控件为例,另外同时将控件的值保存回数据库的通用方法。

CheckBoxList 类

System.Web.UI.WebControls.CheckBoxList 类是提供了一组可复选的选项集合,每个选项以true或false 表示其选中状态。其使用方法基于 ListControl 类。

更多 CheckBoxList 类的介绍请参照如下链接:

https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/design-tools/expression-studio-2/cc294907(v=expression.10)

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

数据提取:在这里我们以MS SQL Server 2016为例

数据源表设计

我们假设要为用户添加角色权限,则需要涉及两个表:

角色字典表

表(sys_chars)用于列出可用的角色,其结构如下:

序号 字段名 类型 说明 备注
1 cid uniqueidentifier 唯一ID 用于后续方法使用
2 charname nvarchar(30) 角色名称

其数据示例如下:

用户角色表

表(sys_UserChars)用于存储用户的可用角色(用户ID+角色ID 唯一),其结构如下:

序号 字段名 类型 说明 备注
1 user_cid uniqueidentifier 用户ID 用户的ID值
2 char_cid uniqueidentifier 角色名称 用记所属的角色ID值

其示例数据如下:

AutoValueDBList 方法

原理

我们需要提取 sys_chars (角色字典表) 数据绑定到 CheckBoxList 控件上,用于显示可用的角色名称。绑定后通过 AutoValueDBList 方法的查询模式,从 sys_UserChars (用户角色表)提取数据并与 CheckBoxList 上的项进行比对,存在的则选中。同理,使用 AutoValueDBList 方法的保存模式,则将用户在 CheckBoxList 上的选项逐一保存到 sys_UserChars (用户角色表)里。

设计

AutoValueDBList 方法主要分查询模式和保存模式,在保存模式的情况下返回成功影响的行数,其参数说明如下表:

序号 参数名 类型 说明
1 strConn string 对应数据库的连接字符串
2 _object ListControl 要感应的 ListControl 类控件,这里泛指 CheckBoxList
3 AutoType string

两种值可选择,“query” 为查询模式,“save” 为保存模式

4 keyFieldType string

连接的目标表的关键字字段类型,如 uniqueidentifier,比如sys_UserChars 中的 user_cid 字段类型

5 linkKeyValue string 连接的目标表的关键字段的值,比如sys_UserChars 中的 user_cid 字段的值
6 Tablename string 要连接的目标表比如 sys_UserChars
7 KeyField string 连接的目标表的关键字字段名,比如sys_UserChars 中的字段 “user_cid” 
8 KeyField2 string 连接的目标表的第二关键字字段名,比如sys_UserChars 中的字段 “char_cid” 
9 CidFieldName string 指定连接目标表的唯一标识字段名,这里仅允许使用 uniqueidentifier 的类型字段,如无则默认不参于 insert 操作,设置则表示其值为 newid()

实现

AutoValueDBList 方法完整代码如下:

public int AutoValueDBList(string strConn,ListControl _object,string AutoType,string keyFieldType,string linkKeyValue,string Tablename,string KeyField,string KeyField2,string CidFieldName)
{
      int rv=-1;
      SqlDbType type=GetSqlDbType(keyFieldType);
 
      SqlConnection Conn = new SqlConnection(strConn );
      SqlCommand Cmd = new SqlCommand();
      Cmd.Connection = Conn;
      if(AutoType=="save")
      {
        Cmd.CommandText = " delete from "+Tablename+" where "+KeyField+"=@"+KeyField;
        SqlParameter   para1=new SqlParameter("@"+KeyField,type);
        para1.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(linkKeyValue)):(object)linkKeyValue);
        Cmd.Parameters.Add(para1);
        try
        {
          Conn.Open();
          Cmd.ExecuteNonQuery();
          Cmd.CommandText = " insert into "+Tablename+"("+KeyField+","+KeyField2+") values(@"+KeyField+",@"+KeyField2+")";
          if(CidFieldName!="")
          {
            Cmd.CommandText = " insert into "+Tablename+"("+CidFieldName+","+KeyField+","+KeyField2+") values(newid(),@"+KeyField+",@"+KeyField2+")";
          }
          SqlParameter   para2=new SqlParameter("@"+KeyField2,type);
          Cmd.Parameters.Add(para2);
          int success=0;
          for(int i=0;i<_object.Items.Count;i++)
          {
            string _value=_object.Items[i].Value;
            if(!_object.Items[i].Selected){continue;}
            para2.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(_value)):(object)_value);
            int si=Cmd.ExecuteNonQuery();
            success+=si;
          }
          return success;
 
        }
        catch (Exception ex)
        {
                    return rv;
        }
        finally
        {
          Conn.Close();
          Conn.Dispose();
        }
      }
      if(AutoType=="query")
      {
        SqlDataReader myDr;
        Cmd.CommandText = " select "+KeyField2+" from "+Tablename+" where "+KeyField+"=@"+KeyField;
        SqlParameter   para1=new SqlParameter("@"+KeyField,type);
        para1.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(linkKeyValue)):(object)linkKeyValue);
        Cmd.Parameters.Add(para1);
        try
        {
          Conn.Open();
          myDr=Cmd.ExecuteReader();
          for(int i=0;i<_object.Items.Count;i++)
          {
            _object.Items[i].Selected=false;
          }
          rv=0;
          while(myDr.Read())
                 {
            rv++;
                   string _dbkey=myDr[KeyField2].ToString();
                   for(int i=0;i<_object.Items.Count;i++)
                   {
                     string _value=_object.Items[i].Value;
                     if(_value==_dbkey){
                       _object.Items[i].Selected=true;
                    }
                   }
                 }
        }
        catch (Exception ex)
        {
                    return rv;
        }
        finally
        {
          Conn.Close();
          Conn.Dispose();
        }
      }
      return rv;
 
}
 
 
 
 
public SqlDbType GetSqlDbType(String TypeInfo) 
{
      TypeInfo=TypeInfo.ToLower();
      //Byte
      if((TypeInfo=="varchar")||(TypeInfo=="system.string"))
      {
        return SqlDbType.VarChar;
      }
      if((TypeInfo=="bigint")||(TypeInfo=="system.int64"))
      {
        return SqlDbType.BigInt;
      }
      if((TypeInfo=="binary")||(TypeInfo=="system.byte[]"))
      {
        return SqlDbType.Binary;
      }
      if((TypeInfo=="bit")||(TypeInfo=="system.boolean"))
      {
        return SqlDbType.Bit;
      }
      if((TypeInfo=="char")||(TypeInfo=="system.char"))
      {
        return SqlDbType.Char;
      }
      if((TypeInfo=="datetime")||(TypeInfo=="system.datetime"))
      {
        return SqlDbType.DateTime;
      }
      if((TypeInfo=="decimal")||(TypeInfo=="system.decimal"))
      {
        return SqlDbType.Decimal;
      }
      if((TypeInfo=="float")||(TypeInfo=="system.double"))
      {
        return SqlDbType.Float;
      }
      if(TypeInfo=="image")
      {
        return SqlDbType.Image;
      }
      if((TypeInfo=="int")||(TypeInfo=="system.int32"))
      {
        return SqlDbType.Int;
      }
      if((TypeInfo=="money")||(TypeInfo=="system.decimal"))
      {
        return SqlDbType.Money;
      }
      if(TypeInfo=="nchar")
      {
        return SqlDbType.NChar;
      }
      if(TypeInfo=="ntext")
      {
        return SqlDbType.NText;
      }
      if(TypeInfo=="nvarchar")
      {
        return SqlDbType.NVarChar;
      }
      if((TypeInfo=="real")||(TypeInfo=="system.single"))
      {
        return SqlDbType.Real;
      }
      if(TypeInfo=="smalldatetime")
      {
        return SqlDbType.SmallDateTime;
      }
      if((TypeInfo=="smallint")||(TypeInfo=="system.int16"))
      {
        return SqlDbType.SmallInt;
      }
      if(TypeInfo=="smallmoney")
      {
        return SqlDbType.SmallMoney;
      }
      if(TypeInfo=="text")
      {
        return SqlDbType.Text;
      }
      if((TypeInfo=="timestamp")||(TypeInfo=="system.timespan"))
      {
        return SqlDbType.Timestamp;
      }
      if((TypeInfo=="tinyint")||(TypeInfo=="system.byte"))
      {
        return SqlDbType.TinyInt;
      }
      if((TypeInfo=="uniqueidentifier")||(TypeInfo=="system.guid"))
      {
        return SqlDbType.UniqueIdentifier;
      }
      if(TypeInfo=="varbinary")
      {
        return SqlDbType.VarBinary;
      }
      if(TypeInfo=="variant")
      {
        return SqlDbType.Variant;
      }
      return SqlDbType.VarChar;
}// end GetSqlDbType function   

调用示例

初始化数据

假设前端 UI 有 ID  为 CBL 的 CheckBoxList 控件,则调用的示例代码如下:

simpleDataListEx("sqlserver","数据库连接串","select cid, charname from sys_chars", null, "cid", "charname", CBL, false, "", "","");

有关 simpeDataListEx 的使用方法请阅读我的文章《C# Web控件与数据感应之 Control 类》。

启动查询模式

初始化完成后,启动 AutoValueDBList 方法的查询模式,进行比对操作。示例代码如下:

string user_cid_value="1F044A84-9154-466B-9B9F-894282625729";
AutoValueDBList("你的数据库连接串",CBL, "query", "uniqueidentifier", user_cid_value, "sys_userchars", "user_cid", "char_cid");

使用保存模式

当用户重新进行复选操作时,可以将结果提交给数据库进行保存。示例代码如下:

string user_cid_value="1F044A84-9154-466B-9B9F-894282625729";
AutoValueDBList("你的数据库连接串",CBL,"save","uniqueidentifier",user_cid_value,"sys_userchars","user_cid","char_cid","cid");

小结

范例中使用的MS SQL SERVER 数据库,我的下载资源还提供了 Oracle 9i及达梦数据库的驱动链接库,请下载我的资源:

https://download.csdn.net/download/michaelline/89235824

我们可以根据需要改造方法,另外 AutoValueDBList 方法基于 ListControl 类,我们可以根据实际的需要进行使用和改造。感谢您的阅读,希望本文能够对您有所帮助。

相关文章
|
8天前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
8天前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
27 4
|
9天前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
26 0
|
1月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
66 2
|
20天前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
23天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
45 1
|
6天前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
8 0
|
8天前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
33 0
|
1月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
21 2
|
2月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
62 0