> For the complete documentation index, see [llms.txt](https://johch3n611u.gitbook.io/c50108/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201903/2019-0305-ss-and-asp.net-web-froms.md).

# 2019/0305/SS查詢式end\&ASP.NET\_Gridview\_自訂樣式分頁

## 效能&反向運算

集合 一筆資料或以上使用 in&#x20;

in 查詢 一定要指定欄位 exists不用指定欄位但需要指定關聯

```
select * from 課程 where 課程編號 in 
(select 課程編號 from 班級 where 學號 in 
(select 學號 from 學生 where 姓名='周杰輪'))
```

子查詢效能較不好最好以 inner join 寫法 先將多表和為一表並關聯最後查詢一次

```
select 課程.* from 課程 
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪'
```

### 反向子查詢 在in前+not即可

```
select * from 課程 where 課程編號 not in 
(select 課程編號 from 班級 where 學號 in 
(select 學號 from 學生 where 姓名='周杰輪'))
```

不用子查詢但同樣結果 做差集 或 EXCEPT前+NOT

```
select 課程.* from 課程
except
select 課程.* from 課程 
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪
```

Not 效能較差會盡量避免 < 集合運算 < 直接查詢

### ANSI - SQL  用在任何資料庫都可以的

sybase infoint

mysql

sqlserver t-sql&#x20;

oracle pl sql

Select \* from tbname

### all 全部都滿足

```
select * from 員工 where 薪水>=all
(select 薪水 from 員工 where 城市='台北')
```

### some 或 any (t-sql) 只要其中滿足

```
select * from 員工 where 薪水>=some
(select 薪水 from 員工 where 城市='台北')

select * from 員工 where 薪水>=any
(select 薪水 from 員工 where 城市='台北')
```

### order by 子句 offset  x rows&#x20;

排序後空出x筆後查詢顯示

```
select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows
```

### fetch next 只顯示

```
select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows
fetch next 2 rows only
```

### null與資料轉換

is null 不是 = null

\=' ' 空字串

函數ISNULL(欄位,函式)

ex. ISNULL(電話,'尚未填寫')

```
select * from 員工 where 電話 is null

select 身份證字號,姓名,ISNULL(電話,'尚未填寫'),薪水 from 員工
```

生日時間型態資料餵尚未填寫字串

資料轉換

### CAST (值 AS 資料型態)

```
select 學號,姓名, isnull(cast(生日 as varchar),'尚未填寫') from 學生

select cast(生日 as varchar) from 學生

select cast(100 as varchar)
```

### CONVERT 萬用轉型

CONVERT ( 資料型態 , 值 , 格式代號 )

```
select convert(varchar,生日,20)  from 學生
select 學號,姓名, isnull(convert(varchar,生日,20),'尚未填寫') from 學生
```

### CTE查詢

ex.此人同時是員工也是教授&#x20;

![](/files/-L_AtbmxvqlqzfhIE6uf)

bl遞迴方式查詢

通常會合併表&#x20;

暫存表 with

```
with 有名字的教授表
as
(select 教授.*, 員工.姓名
from 員工 inner join 教授
on 員工.身份證字號=教授.身份證字號)

select *
from 班級 
inner join 學生 on 班級.學號=學生.學號
inner join 課程 on 課程.課程編號=班級.課程編號
inner join 有名字的教授表 on 有名字的教授表.教授編號=班級.教授編號
```

\--------

遞迴錨點

![](/files/-L_Au4LPbZ_xVJLUZcU2)

類似自身合併查詢

AS內為CTE內容

```
with 主管2
as
(
select 員工字號,姓名, 1 as 階層 from 主管 where 主管字號 is null
union all
select 主管.員工字號,主管.姓名, 階層+1 from 主管 inner join 主管2 on 主管.主管字號=主管2.員工字號
)
select * from 主管2
order by 階層
```

執行結束條件為 主管字號 = 員工字號  此人為主管

遞迴

從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好. .........(持續下去)

遞迴很困難 通常寫成迴圈後再改成遞迴

## ASP.NET web froms GridView 較複雜自訂樣式分頁

GridView 物件 底下的&#x20;

Gridrow 物件 為GridView 的每一行

pagerrow 物件 為GridView 的最底下控制行

pagertemplate 物件 建立此物件會取代 pagerrow&#x20;

Button 按鈕控制項

LinkButton 外觀像超連結的按鈕控制項

ImageButton 外觀是圖片的按鈕控制項

asp控制項後端的css的class屬性為CssClass

值為純文字的後端框 可用label控制項 屬性text則可藉由後端操控

#### asp.net 後端只能抓到前端控制項屬性值，無法抓到標間中央標籤內的值?

{% embed url="<https://ithelp.ithome.com.tw/questions/10178717>" %}

PageIndex 現在狀態的頁數&#x20;

上一頁 下一頁 合併為 切換分頁

物件觸發事件時會傳兩種東西到後端 1. 名稱 2.事件

### protected void 功能名稱 ( 資料型態 物件名稱 ,EventArgs e )

```
<asp:LinkButton ID="lkbPrev" runat="server" CssClass="btn"
 OnClick="PageChange_Click">3</asp:LinkButton>
<asp:LinkButton ID="lkbNext" runat="server" CssClass="btn"
 OnClick="PageChange_Click">4</asp:LinkButton>
```

```
   //protected void lkbNext_Click(object sender, EventArgs e)
        //{
        //    GridView1.PageIndex++;
        //}

        //protected void lkbPrev_Click(object sender, EventArgs e)
        //{
        //    if(GridView1.PageIndex>0)
        //        GridView1.PageIndex--;
        //}

上面的寫法內聚力較高

        protected void PageChange_Click(object sender, EventArgs e)
        {
            if (((LinkButton)sender).ID == "lkbPrev")
            {
                if (GridView1.PageIndex > 0)
                    GridView1.PageIndex--;
            }
            else
            {
                GridView1.PageIndex++;
            }
        }
```

{% embed url="<https://blog.miniasp.com/post/2007/11/04/ASPNET-FindControl-Tips-and-Hacks>" %}

後端抓前端id 如果控制項擺在別人的控制項內則會抓不到id

必須在後端下指令找到它

```
    protected void GridView1_DataBound(object sender, EventArgs e)
        {
            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            ((Label)GridView1.BottomPagerRow.Cells[0].FindControl("lblInfo")).Text = page;
        }
```

#### 前端薇 lable 所以 後端要轉型(指定型?

#### OnDataBoud事件 繫結時

```
 <asp:GridView ID="GridView1" 
 runat="server" DataSourceID="SqlDataSource1" 
 PageSize="1" AllowPaging="true"
 OnDataBound="GridView1_DataBound"
 >
<PagerTemplate>
<table style="width:100%">
                        <tr>
                            <td>
                               
                                <asp:LinkButton ID="lkbPrev" runat="server" CssClass="btn" OnClick="PageChange_Click">3</asp:LinkButton>
                                <asp:LinkButton ID="lkbNext" runat="server" CssClass="btn" OnClick="PageChange_Click">4</asp:LinkButton>
                                
                                <asp:DropDownList ID="ddlPager" runat="server">
                                  
                                </asp:DropDownList>
                            </td>
                            <td style="text-align:right">
                                <asp:Label ID="lblInfo" runat="server"></asp:Label>  
                            </td>
                        </tr>
</table>
</PagerTemplate>
</asp:GridView>
```

### 下拉式選單

頁數 = 1\~ gridview\.pagecount

每跑一次跑出一個item

```
   protected void GridView1_DataBound(object sender, EventArgs e)
        {
            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            ((Label)GridView1.BottomPagerRow.Cells[0].FindControl("lblInfo")).Text = page;

            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                ListItem item = new ListItem();
                item.Text = i.ToString();
                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ((DropDownList)GridView1.BottomPagerRow.Cells[0].FindControl("ddlPager")).Items.Add(item);
            }

            
        }
```

((DropDownList)GridView1.BottomPagerRow\.Cells\[0].FindControl("ddlPager")) = DropDownList物件

### TextBox  鑄造控制項

TextBox tb = new TextBox ( ) ;&#x20;

&#x20;                                建構子

```
  protected void Page_Load(object sender, EventArgs e)
        {
            //TextBox tb = new TextBox();
            //tb.Text = "abcd";
            //form1.Controls.Add(tb);
        }

```

### 優化 鑄造跟找尋ID不用用迴圈重複

```
protected void GridView1_DataBound(object sender, EventArgs e)
        {
            TableCell tc = GridView1.BottomPagerRow.Cells[0];

            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            Label lblInfo = (Label)tc.FindControl("lblInfo");
            lblInfo.Text = page;

            DropDownList ddlPager = (DropDownList)tc.FindControl("ddlPager");

            ListItem item;
            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                item = new ListItem();
                item.Text = i.ToString();
                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ddlPager.Items.Add(item);
            }            
        }
```

### 利用下拉式選單直接切換頁面 ( 事件一定發生在DROPDOWNLIST上面 )

#### 事件 SELECTEDINDEXCHANGED

#### 區域變數

```
  protected void GridView1_DataBound(object sender, EventArgs e)
        {
 DropDownList ddlPager = (DropDownList)tc.FindControl("ddlPager");

            ListItem item;
            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                item = new ListItem(i.ToString());
                //item.Text = i.ToString();

                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ddlPager.Items.Add(item);
            }
}
```

AUTOPOSTBACK = TURE 才會自動F5

ONTEXTCHANGE = 專注點離開時發生

OVERLODING 多載

TEXT 介面上顯示

VALUE 資料庫給KEY
