C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CheckBoxList コントロールリストの使い方


(過去ログ 131 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■77546 / inTopicNo.1)  CheckBoxList コントロールリストの使い方
  
□投稿者/ Coming Soon (1回)-(2015/10/30(Fri) 16:32:53)

分類:[ASP.NET (VB)] 

ASP.NET 4.5
Visual Studio 2012 Pro Update 5

現在、以下のことをやろうと四苦八苦しております。

30部署ありそれぞれの部署ごとに社員一覧を表示しています。
社員一覧を表示する際にCheckBoxListコントロールを使用して社員名を表示し、
権限Aを持っている社員にはチェックマークを付けて初期表示しています。

以下の方法で実現しています。

CheckBoxListにはObjectDatasourceコントロールを連結しており、
DataTextFieldに社員名のフィールドを指定、
DataValueFieldに権限があるかどうかのフラグ(0もしくは1)のフィールドを指定しています。

DataValueFieldに権限があるかどうかのフラグ(0もしくは1)を指定しているので、
CheckBoxListコントロールのDataBoundイベントでValueが「1」だったらSelected=True とすることでチェックマークのON/OFFを実現しています。

この状態で、更新処理を行うとき、チェックボックスがチェックされているかどうかは拾えるのですが
それがどの社員のチェックボックスなのか判別する術がわかりません。

もしかするとDataValueFieldに社員IDを入れておけばValueの値を拾うことで判別できるのかもしれませんが
この場合は、表示するときにチェックマークのON/OFFをどうやるのかが課題となってしまいます。

このような場合、一般的にどのようなやり方がベストプラクティスなのでしょうか。
よろしくお願いします。

引用返信 編集キー/
■77550 / inTopicNo.2)  Re[1]: CheckBoxList コントロールリストの使い方
□投稿者/ WebSurfer (694回)-(2015/10/30(Fri) 21:37:55)
No77546 (Coming Soon さん) に返信

> DataValueFieldに権限があるかどうかのフラグ(0もしくは1)を指定しているので、
> CheckBoxListコントロールのDataBoundイベントでValueが「1」だったらSelected=True 
> とすることでチェックマークのON/OFFを実現しています。

DataValueField に設定するのは [社員 ID] にしておいて、DataBound イベントでその
社員の権限を調べて、チェックマークの ON/OFF を設定するという方法はいかがでしょ
うか?

他には、CheckBoxList を使うのはやめて、GridView に CheckBox を配置するという手
段もあります。

以下の例は Microsoft が無償で提供している Northwind サンプルデータベースの Products
テーブルの、ProductID (int), ProductName (nvarchar), Discontinued (bit) をそれぞれ
社員 ID、社員名、権限に見たたて作ったものです。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    
    protected void CheckBoxList1_DataBound(object sender, EventArgs e)
    {
        CheckBoxList list = (CheckBoxList)sender;
        
        // またクエリを投げるのは無駄なような気もするが・・・
        DataView view = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

        foreach (ListItem item in list.Items)
        {
            view.RowFilter = String.Format("ProductID='{0}'", item.Value);
            bool auth = (bool)view[0]["Discontinued"];
            item.Selected = auth;
        }
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView drv = (DataRowView)e.Row.DataItem;
            CheckBox cb = (CheckBox)e.Row.FindControl("CheckBox1");
            if (cb != null)
            {
                int id = (int)drv["ProductID"];
                cb.InputAttributes.Add("value", id.ToString());
            }
        }

    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Northwind %>" 
            SelectCommand="SELECT TOP 10 [ProductID], [ProductName], [Discontinued] FROM [Products]">
        </asp:SqlDataSource>

        <h3>CheckBoxList</h3>
        <asp:CheckBoxList ID="CheckBoxList1" runat="server" 
            DataSourceID="SqlDataSource1" DataTextField="ProductName" 
            DataValueField="ProductID" OnDataBound="CheckBoxList1_DataBound">
        </asp:CheckBoxList>

        <hr />

        <h3>GridView</h3>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ProductID" DataSourceID="SqlDataSource1" ShowHeader="False" 
            OnRowDataBound="GridView1_RowDataBound" GridLines="None">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">                    
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" 
                            Checked='<%# Bind("Discontinued") %>' />
                    </ItemTemplate>
                </asp:TemplateField>                
                <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
                    SortExpression="ProductName" />                
            </Columns>
            
        </asp:GridView>
                
    </div>
    </form>
</body>
</html>

引用返信 編集キー/
■77557 / inTopicNo.3)  Re[2]: CheckBoxList コントロールリストの使い方
□投稿者/ Coming Soon (2回)-(2015/10/31(Sat) 10:48:22)
WebSurfer さま

ご回答ありがとうございました。なるほど、都度値を取得するやり方がありますね!参考になりました。
あれから試行錯誤して DataValueField に社員IDとフラグをカンマ区切りで格納し、配列から値を取得するという何ともカッコ悪いやり方をしておりました。

GridViewでもいけそうです。

WebSurferさまより頂いたご回答をもとにブラッシュアップしていきたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -