天花板的个人博客


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

博客模板

发表于 2017-03-18 | 分类于 None

1. 发布新文章

$ hexo new "new article"

之后在source/_posts目录下面,多了一个new-article.md的文件。打开之后修改:

---
title: 新博客
date: 2017-03-11 16:56:50
tags:
    - blog
categories: None
---

修改后保存。之后执行并测试:

$ hexo generate
$ hexo server -p 8080

发布:

$ hexo clean    // 清空
$ hexo g        // 重新生成博客
$ hexo d        // 发布

2. 图片

天花板

存储路径:source/PIC/avatar.png
显示路径:http://breakerthb.github.io/PIC/avatar.png

GitHub使用方法

发表于 2017-03-18 | 分类于 Tools

常用命令

1. 常用配置

1.1 设置Email

$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"

查看结果:

$ git config user.name
$ git config user.email

1.2 用vim写日志

$ git config --global core.editor vim

查看结果:

$ cat ~/.git/config

2. 配置GitHub

2.1.首先在本地创建ssh key

$ ssh-keygen -t rsa -C "your_email@youremail.com"

之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。

$ cat ~/.ssh/id_rsa.pub

回到github,进入Account Settings,左边选择SSH Keys,Add SSH Key,title随便填,粘贴key。

2.2. 验证

为了验证是否成功,在git bash下输入:

$ ssh -T git@github.com 

验证

如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。
这就表示已成功连上github。

成功连接

2.3. 上传GitHub

接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。

$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"

2.4. 添加远程地址

$ git remote add origin git@github.com:yourName/yourRepo.git

后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。

3. 提交、上传

3.1. 在本地仓库里添加文件

$ git add a.txt
$ git commit -m "first commit"

极简方式:

$ git add .
$ git commit -a

3.2. 上传到github:

$ git push -u origin master

如果失败,可能是GitHub上的README.md不在本地,执行:

$ git pull --rebase origin master # 合并

之后再执行push。

git push命令会将本地仓库推送到远程服务器。git pull命令则相反。

修改完代码后,使用git status可以查看文件的差别,使用git add 添加要commit的文件,也可以用git add -i来智能添加文件。之后git commit提交本次修改,git push上传到github。

4. 常用配置

4.1 添加fork me图标

ref : https://github.com/blog/273-github-ribbons

Readme.md模板

<a href="https://github.com/breakerthb/">
<img style="position: absolute; top: 0; left: 0; border: 0;" src="https://camo.githubusercontent.com/82b228a3648bf44fc1163ef44c62fcc60081495e/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f6c6566745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_left_red_aa0000.png">
</a>

# Project Introduction

XXXXX

![](https://github.com/breakerthb/AccessCount/blob/master/intro.png)

# Flag

- Test

# Language

- C++

# Branch

## master

A tool without UI

## ui

A tool with UI

常用6大静态博客

发表于 2017-03-18 | 分类于 None

1 Simple

simple是简单的静态博客生成器,基于GithubPages,完全在线操作,不需要服务器,只需一个 Github 账号即可。简而言之,就是可以在线写blog,然后程序会自动在用户的github pages下的项目生成静态文件。

ref : http://breakerthb.github.io/2017/03/18/SimpleBlog.html

2 Logecho

Logecho是一款静态化博客系统,它可以运行于几乎所有任何支持静态网站的服务器上,以及类似 github.io 之类提供静态托管的平台中。不需要任何服务器配置,写完便可直接发布。

3 Hexo

Hexo是一款基于node.js开发的博客程序,拥有简单的服务器,可用作简单的动态博客使用。也有生成器,生成的静态文件可以一键部署到Github Pages上,也可以部署到任意静态文件服务器上。它相当简约,并且可使用Markdown来编写文章!

ref : https://www.zybuluo.com/breakerthb/note/320028

4 Pelican

Pelican是一个用Python语言编写的静态网站生成器,目前Pelican已发布3.2.2版本,有许多优秀的主题和插件可供使用,支持使用restructuredText和Markdown写文章,配置灵活,扩展性强。

5 Jekyll

Jekyll 是一种基于Ruby开发的、适用于博客的静态网站生成引擎。使用一个模板目录作为网站布局的基础框架,提供了模板、变量、插件等功能,最终生成一个完整的静态Web站点。即只要安装Jekyll的规范和结构,不需写html,便可生成网站。

6 Octopress

Octopress 是一款基于Ruby开发的静态化、本地化的博客系统。其最大的优势就是静态化,不依赖脚本程序,没有MysqL等数据库,因此它可在一些性能差的服务器或者虚拟空间上运行,同等条件下打开页面的速度会比较快。

最简单的静态博客 - SimpleBlog

发表于 2017-03-18 | 分类于 None

ref : https://github.com/isnowfy/simple

GitHub

首先你需要注册一个GitHub的帐号。

创建仓库

创建一个username.github.io的project,注意要勾选生成README。

登录Simple

用github帐号登录simple.点击->Simple

进入页面后点击Initialize来初始化blog,之后点击Go就可以开始写markdown的blog了。

写博客

simple

单击New post就可以新建文章来开始写作了,完成之后点击Save就可以生成静态页面了,之后访问你的username.github.io就可以看到生成的blog了!

注意github pages貌似有缓存,也就是说会有一段时间的延迟,可能不能立即看到效果,不过等几分钟就好啦。

SqlHelper调用存储过程的方法

发表于 2017-03-18 | 分类于 CSharp

ASP.NET中调用存储过程经常遇到这样那样的问题,特别是在有返回值参数的情况下。其实,并没有想象中的复杂。我们以之前博文中定义的存储过程为例。

http://blog.sina.com.cn/s/blog_6849d1c201017mo7.html

SqlHelper下载路径:http://www.kuaipan.cn/file/id_61213523170038890.htm

首先是定义链接字符串:

// 连接字符串
string strConn = "Initial Catalog='Students';Server='127.0.0.1,1433';User ID='sa';Password='XXXXXX';Persist Security Info=True";
// SQL 连接对象
SqlConnection Connection = new SqlConnection(strConn);

一,插入新纪录存储过程

int ret = 0;
SqlParameter[] arParms = new SqlParameter[2];

// @Name Input Parameter
// NChar 类型需要指定Size
arParms[0] = new SqlParameter("@Name", SqlDbType.NChar, 50);
arParms[0].Value = "HHEE";

// @NewID Output Parameter 
// 输出参数不需要赋值
arParms[1] = new SqlParameter("@NewID", SqlDbType.Int);
arParms[1].Direction = ParameterDirection.Output;

SqlHelper.ExecuteNonQuery(strConn, CommandType.StoredProcedure, "proc_school_insert", arParms);

ret = Int32.Parse(arParms[1].Value.ToString());

二,删除记录存储过程

SqlHelper.ExecuteNonQuery(strConn, CommandType.StoredProcedure, "proc_school_del",
            new SqlParameter("@ID", 4));

三,修改记录存储过程

SqlParameter[] para = { new SqlParameter("@ID", 5), 
                                new SqlParameter("@Name", "1234") };
SqlHelper.ExecuteNonQuery(strConn, CommandType.StoredProcedure, "proc_school_update",
            para);

四,查询存储过程

SqlDataReader read = SqlHelper.ExecuteReader(strConn, CommandType.StoredProcedure, "proc_school_select", new SqlParameter("@ID", 5));

while (read.Read())
{
    string str0 = read[0].ToString();
    string str1 = read[1].ToString();
}

PS:对于调用存储过程时参数的传递方法,其实比较灵活。有兴趣的可以自己多多实验。

C# RadioButtonList控件(在线投票功能)

发表于 2017-03-18 | 分类于 CSharp

涉及技术点:

  • RadioButtonList控件的使用
  • 三层架构
  • ObjectDataSource绑定控件
  • 触发器的使用

RadioButtonList实际上是RadioButton控件的一个容器,能够通过一个对象处理N个单选控件。
我们要建立一个能够随时更改投票内容的动态投票系统。维护人员能够通过简单的数据库修改发起一个新投票。在这个例子中,我们会有两个投票项目,可以动态切换。

一,建立数据库

create table TVote
(
    Id int NOT NULL primary key,
    Title nchar(100) NULL, 
    TotleCnt int NULL, 
);

insert into TVote values(1,'今天下班去哪儿吃饭?', 0);
insert into TVote values(2,'先进员工评选', 0);

create table TVoteDetail
(
    Id int IDENTITY(1,1) NOT NULL primary key, 
    Detail nchar(100) NULL, 
    VoteId int references TVote(Id), 
    Cnt int NULL 
);

insert into TVoteDetail values('食堂',1,0);
insert into TVoteDetail values('小吃城',1,0);
insert into TVoteDetail values('快餐店',1,0);
insert into TVoteDetail values('大排档',1,0);
insert into TVoteDetail values('张三',2,0);
insert into TVoteDetail values('李四',2,0);
insert into TVoteDetail values('王五',2,0);
insert into TVoteDetail values('赵六',2,0);

我们总共建立了两张表,TVote作为主表,保存每个投票项目,TVoteDetail表保存投票的具体内容。
每当TVoteDetail中的得票数修改,TVote表中的全部票数也要跟着修改。这里用触发器来实现。脚本如下:

if exists(select name from sysobjects where name='TVoteDetail_Update' and type='tr')
    drop trigger TVoteDetail_Update
    go
    create trigger TVoteDetail_Update
    on TVoteDetail
    for UPDATE
    as
    if(update(Cnt))
    begin
    declare @voteid int 
    declare @totalcnt int
    select @voteid = VoteId from Inserted

    select @totalcnt = sum(cnt) from TVoteDetail 
    where VoteId = @voteid
    group by VoteId
    update TVote set TotleCnt=@totalcnt where Id=@voteid
end

这样数据库部分完成。

二,DAL层代码

///
/// 得到投票标题
///
/// 投票项ID
/// 投票项标题
public SqlDataReader GetVoteTitle(int nVoteID)
{
    string strConn = SqlHelper.GetConnSting();
    string strSQL = "select Title from TVote where Id=" + nVoteID.ToString();
    return SqlHelper.ExecuteReader(strConn, CommandType.Text, strSQL);
}

///
/// 得票数加1
///
/// 投票项目ID
public void UpdateVoteCnt(int nID)
{
    string strConn = SqlHelper.GetConnSting();
    string strSQL = "update TVoteDetail set Cnt=Cnt+1 where Id=" + nID;
    SqlHelper.ExecuteNonQuery(strConn, CommandType.Text, strSQL);
}

SQLHelper类的使用前面的本文已经介绍了,这里不再赘述。

三,BLL代码

[DataObjectMethod(DataObjectMethodType.Select)]
public static SqlDataReader GetVoteDetail(int nVoteID)
{
    DAL da = new DAL();
    return da.GetVoteDetail(nVoteID);
}
public static void UpdateVoteCnt(int nID)
{
    DAL da = new DAL();
    da.UpdateVoteCnt(nID);
}

四,UI层

1.在APSX页面中添加如下代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>投票系统</title>   
    <style type="text/css">
        .style1
        {
            width: 500px;
            margin:auto;
            border-style:solid;
            border-color:Black;
            border-width:1px;
        }
        .style2
        {
            height: 35px;
            background-color:#0066CC;
            color:White;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div style="width:100%; text-align:center;">
        <table class="style1">
            <tr>
                <td class="style2">
                    <strong>投票系统</strong></td>
            </tr>
            <tr>
                <td>
                    <asp:Label ID="lblTitle" runat="server" Text="Label"></asp:Label>
                    <asp:RadioButtonList ID="rblVote" runat="server" 
                        DataSourceID="ObjectDataSource1" DataTextField="Detail" DataValueField="Id">
                    </asp:RadioButtonList>
                </td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:Button ID="btnSubmit" runat="server" onclick="btnSubmit_Click" Text="提交" />
&nbsp;<asp:Button ID="btnResult" runat="server" onclick="btnResult_Click" Text="结果" />
                </td>
            </tr>
        </table>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
            DeleteMethod="Delete" InsertMethod="Add" 
            onselecting="ObjectDataSource1_Selecting" SelectMethod="GetVoteDetail" 
            TypeName="BLL" UpdateMethod="Update" 
            OldValuesParameterFormatString="original_{0}">
            <DeleteParameters>
                <asp:Parameter Name="nFavorID" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="strFavor" Type="String" />
            </InsertParameters>
            <SelectParameters>
                <asp:Parameter Name="nVoteID" Type="Int32" />
            </SelectParameters>
            <UpdateParameters>
                <asp:Parameter Name="nFavorID" Type="Int32" />
            </UpdateParameters>
        </asp:ObjectDataSource>
    </div>
    </form>
</body>
</html>

2.后台代码

public const int nVoteID = 2; // 设置投票ID

protected void Page_Load(object sender, EventArgs e)
{
    lblTitle.Text = BLL.GetVoteTitle(nVoteID);
}

protected void btnSubmit_Click1(object sender, EventArgs e)
{
    int nID = Convert.ToInt32(rblVote.SelectedValue);

    BLL.UpdateVoteCnt(nID);
}
protected void btnLook_Click(object sender, EventArgs e)
{

}
protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
    // ObjectDataSource 指定的是带有参数的select方法
    e.InputParameters["nVoteID"] = nVoteID;  
}

注意,ObjectDataSource控件需要指定BLL中的GetVoteDetail方法作为Select方法。
选择了需要投票的项目之后,提交。数据库中相应的项目会改变。自己试试吧。

C# CheckBoxList控件

发表于 2017-03-18 | 分类于 CSharp

单个的CheckBox控件对于一两个复选框的使用是比较方便的,然而,如果想要在一个页面中排放n个复选框,而且这些复选框的内容需要从数据库中动态获取时,CheckBoxList控件就非常有用。它能够通过控件数组的方法操作一系列的复选框。

下面介绍CheckBoxList控件的一些简单用法。

1.与ObjectDataSource绑定

1)创建一个与数据库关联好的ObjectDataSource控件。如有问题请参考:

http://blog.sina.com.cn/s/blog_6849d1c201017ryg.html

2)为CheckListBox选择新数据源

CheckBoxList控件

3)选择

CheckBoxList控件

数据源选择ObjectDataSource即可。后面两项一个是显示内容,一个是值内容(Value属性的值)。这两项都要填数据表中的字段。
这样就绑定成功了。

2.添加项

checkedListBox1.Items.Add("蓝色");
checkedListBox1.Items.Add("红色");
checkedListBox1.Items.Add("黄色");

3.判断第i项是否选中,选中为true,否则为false

if(checkedListBox1.GetItemChecked(i))
{
    return true;
}
else
{
    return false;
}

4.设置第i项是否选中

checkedListBox1.SetItemChecked(i, true); //true改为false为没有选中。
checkedListBox1.SetItemCheckState(i, CheckState.Checked);

5.设置全选

if(true)
{
    for (int j = 0; j < checkedListBox1.Items.Count; j++)
        checkedListBox1.SetItemChecked(j, true);
}
else
{
    for (int j =0; j < checkedListBox1.Items.Count; j++)
        checkedListBox1.SetItemChecked(j, false);
}

6.得到全部选中的值 ,并将选中的项的文本组合成为一个字符串。

string strCollected = string.Empty;
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
    if (checkedListBox1.GetItemChecked(i))
    {
        if (strCollected == string.Empty)
        {
            strCollected = checkedListBox1.GetItemText(checkedListBox1.Items[i]);
        }
        else
        {
            strCollected = strCollected + "/" + checkedListBox1.GetItemText(checkedListBox1.Items[i]);
         }
     }
}

7.清除checkedListBox中所有的选项

for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
    checkedListBox1.Items.Clear();
}

8.设置索引为index的项为选中状态

for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
    checkedListBox1.SetItemChecked(i, true);
}

9.选中checkedListBox1所有的选项

for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
    checkedListBox1.SetItemCheckState(i, CheckState.Checked);
}

10.checkedListBox1中选定的项->checkedListBox2

for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
{
checkedListBox2.Items.Add(this.checkedListBox1.CheckedItems);

//remove是除去一个具体的值,不是index,注意了
checkedListBox1.Items.Remove(this.checkedListBox1.CheckedItems);
}

PS: CheckBoxList控件中的每个CheckBox的排列方法都可以通过属性界面进行调整,请参考:
http://msdn.microsoft.com/zh-tw/library/wffkd2c9.aspx

ListBox&DropDownList控件(省、市选择)

发表于 2017-03-18 | 分类于 CSharp

涉及技术点:

    1. ListBox控件的用法
    1. DropDownList控件的用法
    1. 控件联动
    1. ObjectDataSource绑定控件后的数据刷新
    1. 给Select方法带参数的ObjectDataSource控件传参

在信息填写的表单中,常会需要填写省市之类的信息,如果能够选取会比较方便。这里就涉及一个控件联动的问题。下面我们就具体了解一下如何利用前面提到的技术设计这么一个从后台管理到前台应用的程序。

一,数据库设计

需要两张表,一张保存省的名称,另一张保存市的名称。两张表是1:n的级联关系。下面是创建数据库脚本:

create table TProvince
(
  Id int primary key identity,
  Name varchar(50) not null
)

create table TCity
(
  Id int primary key identity,
  Name varchar(50) not null,
  ProvinceId int references TProvince(Id)
)

在表中添加一条基本信息,用来初始显示。

insert into TProvince values('北京')
insert into TCity values('北京', 1)

这样,数据库就建立好了。

二,新建数据集

我们这次完全使用控件绑定来完成数据库的访问,以数据集为基础。
1.新建一个数据集(DataSet),命名为DSProvinceCity.xsd
2.从工具箱中添加两个TableAdapter,分别与 TProvince 和 TCity 表关联。具体方法之前的日志已经讲过。添加后,会生成两个DataTable对象(TProvice和TCity)还有两个TableAdapter对象(TProvinceTableAdapter和TCityAdaper)。如图所示。

ListBox&DropDownList控件(省、市选择)

三,UI设计

页面分为两部分,后台管理部分和前台应用部分。
后台管理部分:用于帮助管理员上传各个省、市名称和对应关系的数据
前台应用部分:用户上传数据时使用

四,后台管理部分(ListBox联动)

1.在页面中添加两个ListBox控件,分别命名为lbProvince和lbCity
2.添加一个ObjectDataSource控件,命名为ODSProvince,配置数据源
3.选择业务对象

ListBox&DropDownList控件(省、市选择)

4.重复2、3添加另一个ObjectDataSource控件(ODSCity)。并配置数据源
5.为lbProvince选择数据源

ListBox&DropDownList控件(省、市选择)

6.为lbCity选择数据源

http://s9.sinaimg.cn/large/6849d1c2g0a4382bbc698&690

运行一下看看是否能够正常显示数据。下面我们看看如何设计一个添加“省”的功能。
7.在页面上添加一个TextBox控件,命名为txtProvinceAdd。再添加一个Button,命名为btnProvinceAdd。并添加如下代码:

protected void btnProvinceAdd_Click(object sender, EventArgs e)
{
    TProvinceTableAdapter province = new TProvinceTableAdapter();
    province.Insert(txtProvinceAdd.Text.ToString().Trim());
    txtProvinceAdd.Text = "";
    lbProvince.DataBind(); // 重新绑定数据源
}

给没有引用的命名空间加入using语句,这里可以用VS中的自动添加功能。这样我们就能通过TProvinceTableAdapter 提供的方法将新的省名写进数据库了。
lbProvince.DataBind();
这句话很重要,如果没有它,添加了省名的lbProvince控件不会有任何变化。重新绑定后能实现数据的刷新。
运行一下程序,添加几个省。

8.重复7的动作,添加txtCityAdd和btnCityAdd。并添加如下代码:

protected void btnCityAdd_Click(object sender, EventArgs e)
{
    TCityTableAdapter city = new TCityTableAdapter();
    city.Insert(txtCityAdd.Text.ToString().Trim(), Convert.ToInt16(lbProvince.SelectedValue));
    txtCityAdd.Text = "";
    lbCity.DataBind();
}

由于市名需要和省名进行关联,因此我们在添加市之前要先选择一个省名,lbProvince控件获得焦点后,lbProvince.SelectedValue语句能够得到选中省名的ID号。
为两个ListBox添加初始焦点位置,代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) // 只有第一次加载时付初值
    {
        lbProvince.SelectedIndex = 0;
        lbCity.SelectedIndex = 0;
    }
}

运行一下程序,给某个省添加几个市吧。
貌似有点问题,好像添加之后省和市并不对应。那是因为两个控件的联动没有做好。

9.将lbProvince控件的AutoPostBack属性设为True,并添加点击事件。代码如下:

protected void lbProvince_SelectedIndexChanged(object sender, EventArgs e)
{
    lbCity.DataBind();
}

10.修改TCityTableAdapter的Select方法

ListBox&DropDownList控件(省、市选择)

在DataSet数据集界面中,选择TCityTableAdapter,在它的SelectCommand子属性中,选择CommandText。弹出查询生成器。

ListBox&DropDownList控件(省、市选择)

在SQL语句中添加“where ProvinceId=@ProvinceId”语句。
这是,运行程序会报错,因为ODSCity控件没有给TCityTableAdapter传参。

11.修改ODSCity

双击ODSCity控件,添加如下代码:

protected void ODSCity_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["ProvinceId"] = lbProvince.SelectedValue; // 传参方法
}

这下再运行试试。是不是一切都对了。
如果需要添加删除方法,可以继续下面的步骤。

12.添加两个Button,分别命名为btnProvinceDel和btnCityDel。实现代码如下:

protected void btnProvinceDel_Click(object sender, EventArgs e)
{
    int nProvinceID = Convert.ToInt16(lbProvince.SelectedValue);

    TCityTableAdapter city = new TCityTableAdapter();
    DSProvinceCity.TCityDataTable cityTable = city.GetCityData(nProvinceID);

    if (cityTable.Rows.Count > 0)
    {
        Response.Write("<script type="text/javascript">alert('这个省不能删除!');</script>");
    }
    else
    {
        TProvinceTableAdapter province = new TProvinceTableAdapter();
        province.Delete(nProvinceID);
    }
}
protected void btnCityDel_Click(object sender, EventArgs e)
{
    TCityTableAdapter city = new TCityTableAdapter();
    city.Delete(Convert.ToInt16(lbCity.SelectedValue));

    lbCity.DataBind();
}

由于省表的ID是市表的外键,因此在删除省中的记录时要先判断是否已经将级联关系删除完全。

这样,后台管理程序就OK了。

五,前台管理程序

1.在页面中添加两个DropDownList控件,分别命名为ddlProvince和ddlCity
2.创建一个新ObjectDataSource控件,命名为ODSCityAnother与TCityTableAdaper关联
3.与ListBox控件类似,让ddlProvince控件与ODSProvince控件绑定,让ddlCity控件与ODSCityAnother控件绑定
4.双击ODSCityAnother控件,添加代码如下:

protected void ODSCityAnother_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["ProvinceId"] = ddlProvince.SelectedValue; 
}

5.双击ddlProvince控件,添加代码如下:

protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e)
{
    ddlCity.DataBind();
}

6.ddlProvince控件AutoPostBack属性设为True

运行一下,感受前台程序的体验吧。是不是很爽啊,哈哈~

附录:

ASPX页面代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ProvinceCity</title>
    <style type="text/css">
        .style1
        {
            width: 500;
            border-width:1px;
            border-style:solid;
            border-color:Black;
            margin:auto;
        }
        .Title
        {
            width:204px;
            background-color:Blue;
            color:White;
        }
        .style2
        {
            width: 204px;
            border-width:1px;
            border-style:solid;
            border-color:Black;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">

    <div style=" width:100%; text-align:center;">
        <div style="height:30px;">后台管理程序</div>
        <table class="style1">
            <tr>
                <td class="Title">
                    省</td>
                <td class="Title">
                    市</td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:ListBox ID="lbProvince" runat="server"  
                        DataSourceID="ODSProvince" DataTextField="Name" DataValueField="Id" 
                        Height="220px" 
                        Width="200px" onselectedindexchanged="lbProvince_SelectedIndexChanged"></asp:ListBox>
                </td>
                <td class="style2">
                    <asp:ListBox ID="lbCity" runat="server" DataSourceID="ODSCity" 
                        DataTextField="Name" DataValueField="Id" Height="220px" Width="200px">
                    </asp:ListBox>
                </td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:Button ID="btnProvinceDel" runat="server"  
                        Text="删除" onclick="btnProvinceDel_Click" />
                </td>
                <td class="style2">
                    <asp:Button ID="btnCityDel" runat="server" Text="删除" onclick="btnCityDel_Click" 
                         />
                </td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:TextBox ID="txtProvinceAdd" runat="server"></asp:TextBox>
                    <asp:Button ID="btnProvinceAdd" runat="server" Text="添加" 
                        onclick="btnProvinceAdd_Click" />
                </td>
                <td class="style2">
                    <asp:TextBox ID="txtCityAdd" runat="server"></asp:TextBox>
                    <asp:Button ID="btnCityAdd" runat="server" Text="添加" 
                        onclick="btnCityAdd_Click" />
                </td>
            </tr>
            <tr>
                <td class="style2">
                    &nbsp;</td>
                <td class="style2">
                    &nbsp;</td>
            </tr>
        </table>
    </div>

    <asp:ObjectDataSource ID="ODSProvince" runat="server" DeleteMethod="Delete" 
        InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" 
        SelectMethod="GetProvinceData" 
        TypeName="DSProvinceCityTableAdapters.TProvinceTableAdapter" 
        UpdateMethod="Update">
        <DeleteParameters>
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </DeleteParameters>
        <InsertParameters>
            <asp:Parameter Name="Name" Type="String" />
        </InsertParameters>
        <UpdateParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </UpdateParameters>
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="ODSCity" runat="server" DeleteMethod="Delete" 
        InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" 
        SelectMethod="GetCityData" 
        TypeName="DSProvinceCityTableAdapters.TCityTableAdapter" 
        UpdateMethod="Update" onselecting="ODSCity_Selecting">
        <DeleteParameters>
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </DeleteParameters>
        <InsertParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="ProvinceId" Type="Int32" />
        </InsertParameters>
        <UpdateParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="ProvinceId" Type="Int32" />
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </UpdateParameters>
    </asp:ObjectDataSource>
    <hr/>

    <div style=" width:100%; text-align:center;">
        <div style="height:30px;">前台应用程序</div>
         <table class="style1">
            <tr>
                <td class="Title">
                    省</td>
                <td class="Title">
                    市</td>
            </tr>
            <tr>
                <td class="style2">
                    <asp:DropDownList ID="ddlProvince" runat="server"  
                        DataSourceID="ODSProvince" DataTextField="Name" DataValueField="Id" onselectedindexchanged="ddlProvince_SelectedIndexChanged" 
                        >
                    </asp:DropDownList>
                </td>
                <td class="style2">
                    <asp:DropDownList ID="ddlCity" runat="server" DataSourceID="ODSCityAnother" 
                        DataTextField="Name" DataValueField="Id">
                    </asp:DropDownList>
                </td>
            </tr>
          </table>
    </div>

    <asp:ObjectDataSource ID="ODSCityAnother" runat="server" DeleteMethod="Delete" 
        InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" 
        onselecting="ODSCityAnother_Selecting" SelectMethod="GetCityData" 
        TypeName="DSProvinceCityTableAdapters.TCityTableAdapter" UpdateMethod="Update">
        <DeleteParameters>
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </DeleteParameters>
        <InsertParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="ProvinceId" Type="Int32" />
        </InsertParameters>
        <SelectParameters>
            <asp:Parameter Name="ProvinceId" Type="Int32" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="ProvinceId" Type="Int32" />
            <asp:Parameter Name="Original_Id" Type="Int32" />
        </UpdateParameters>
    </asp:ObjectDataSource>
    <hr/>
    </form>
</body>
</html>

ObjectDataSource数据源控件(2)自动实现

发表于 2017-03-18 | 分类于 None

ObjectDataSource可在多个页面中重复使用,这点和SqlDataSource不同。

我们可以通过VS向导自动创建访问数据库的类,这样就可以省去(1)中提到的自行定义BLL层接口的动作。

设置步骤如下:

一,TableAdapter控件

1.“添加新项”中选择“数据集”

之后点击添加按钮。

2.打开该数据集的设计界面,在工具箱中拖入TableAdapter控件

3.接着会自动弹出“TableAdapter配置向导”,选择连接字符串,点“下一步”
注意:若没有现成的数据链接供选择,可以点击“新建连接”按钮通过新建向导来创建。这里不具体介绍了。

4.选择”使用SQL语句”,点“下一步”

5.点击“选择查询生成器”-> 选择表 -> 所有列(*) -> 点击“确定”

6.点击“高级选项” -> “生成Insert,Update,Delete语句” -> “确定”

7.完成
重新编译一下网站。

二,验证ObjectDataSource

1.新建网页ObjectDataSourceDemo.aspx -> 把ObjectDataSource拖入设计界面 -> 配置数据源 -> 选择业务对象(刚刚建的DataSet类) -> 下一步 -> 完成

2.拖入GridView控件 -> 选择数据源 ->ObjectDataSource1

表中的数据就能在GrideView控件中正确显示了。

3.选择”使用SQL语句”,点“下一步”

4.点击“选择查询生成器”-> 选择表 -> 所有列(*) -> 点击“确定”

5.点击“高级选项” -> “生成Insert,Update,Delete语句” -> “确定”

6.完成
重新编译一下网站。

二,验证ObjectDataSource

1.新建网页ObjectDataSourceDemo.aspx -> 把ObjectDataSource拖入设计界面 -> 配置数据源 -> 选择业务对象(刚刚建的DataSet类) -> 下一步 -> 完成

2.拖入GridView控件 -> 选择数据源 ->ObjectDataSource1

表中的数据就能在GrideView控件中正确显示了。

ObjectDataSource数据源控件(1)手动实现

发表于 2017-03-18 | 分类于 CSharp

ASP.NET中,数据源控件是所有显示控件和数据库绑定的媒介,因此相当重要。数据源控件实际上是帮助绑定动作完成数据库的增、删、改、查功能。
与SqlDataSource相比,ObjectDataSource更适用于三层架构(UI、BLL、DAL)的开发。用户可以自行定义访问数据库接口。
ObjectDataSource控件实际上是通过一个BLL层类完成对某一个特定数据库的操作。

1.建立三层架构

这里,我们用DAL和BLL两个类来代表这两个层。至于UI层,自然是ASPX页面了。

2.BLL层

public class BLL{
 [DataObjectMethod(DataObjectMethodType.Insert)]
    public static int Add(string strInfo)
    {
      DAL da = new DAL();
      return da.Add(strInfo);
    }

    [DataObjectMethod(DataObjectMethodType.Delete)]
    public static void Delete(int nID)
    {
      DAL da = new DAL();
      da.Delete(nID)
    }

    [DataObjectMethod(DataObjectMethodType.Update)]
    public static void Update(int nID, string strInfo)
    {
      DAL da = new DAL();
      da.Update(nID, strInfo);
    }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public static SqlDataReader GetAll()
    {
        DAL da = new DAL();
        return da.GetAll();
    }
}

注意:中括号里的语句用了声明这四个函数的意义,方便后面绑定控件时指定相关方法。

3.DAL层

public class DAL{
    public int Add(string strInfo)
    {
      // 连接Database, 调用Insert语句
    }

    public void Delete(int nID)
    {
      // 连接Database, 调用Delete语句
    }

    public void Update(int nID, string strInfo)
    {
      // 连接Database, 调用update语句
    }

    public SqlDataReader GetAll()
    {
      // 连接Database, 调用select语句
    }
}

4.绑定ObjectDataSource控件

1) 从工具箱中拖拽一个ObjectDataSource控件到需要的ASPX页面中

2)配置数据源

ObjectDataSource数据源控件

3)选择业务对象:BLL类

ObjectDataSource数据源控件

下一步

4)定义数据方法

ObjectDataSource数据源控件

分别给增删改查方法指定BLL类中的方法。

点击“完成”。这样一个ObjectDataSource控件就定义完成了,之后可以使用它为其他控件提供数据服务。

12
天花板

天花板

Do not give up unless you die

14 日志
4 分类
8 标签
GitHub 知乎
Links
  • 简书
© 2017 天花板