QA@IT
«回答へ戻る

回答を投稿

ありがとうございます
質問の書き方が悪かったです
1.に関しては、クリックしたらチェックの状態を変化させたいです
イメージボタンがあったのでそちらで試してみたのですが、
イメージボタンをクリックしたときに、クリックした時に押し込んだ状態のイメージにしようと思ったのですが、
クリックしたら、再度読み出してしまいました

aspxファイルのGridViewにテンプレートフィールドを追加した

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="t1" DataSourceID="SqlDataSource1" AllowSorting="True" Height="115px" 
    onrowcreated="GridView1_RowCreated" Width="87px">
    <Columns>
        <asp:BoundField DataField="t1" HeaderText="t1" ReadOnly="True" 
            SortExpression="t1" />
        <asp:BoundField DataField="chStr" HeaderText="chStr" SortExpression="chStr" />
        <asp:BoundField DataField="ch" HeaderText="ch" SortExpression="ch" />
        <asp:CheckBoxField DataField="chBit" HeaderText="chBit" 
            SortExpression="chBit" />
        <asp:TemplateField SortExpression="chBit" HeaderText="chBitTmplt">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("chStr") %>'></asp:Label>
                <asp:Image ID="Image1" runat="server" ImageUrl="~/img/check_no.bmp" />
                <asp:ImageButton ID="ImageButton1" runat="server" 
                    ImageUrl="~/img/check_no.bmp" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

csファイルRowCreatedにイメージ入れ替え処理追加

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //データ内容によって、チェックボックスを変化させる
    DataRowView d1 = (DataRowView)e.Row.DataItem;   //グリッドビューに結びついているデータ                

    if (d1 != null) {                               
        var d = d1.Row["chBit"];                    //chBitの状態をチェック
        int iCnt = e.Row.Cells[4].Controls.Count;
        //イメージで
        for (int i = 0; i < iCnt; i++) {
            //イメージボタン
            if (e.Row.Cells[4].Controls[i].ID == "ImageButton1") {
                ImageButton ib = (ImageButton)e.Row.Cells[4].Controls[i];
                if (d == null) {
                    ib.Visible = false;
                } else if (d is DBNull) {
                    ib.Visible = false;
                } else if ((bool)d == false) {
                    ib.ImageUrl = "~/img/check_act.bmp";
                }
            }
            //イメージコントロール
            if (e.Row.Cells[4].Controls[i].ID == "Image1") {
                Image img = (Image)e.Row.Cells[4].Controls[i];
                if (d == null) {
                    img.Visible = false;
                } else if (d is DBNull) {
                    img.Visible = false;
                } else if ((bool)d == false) {
                    img.ImageUrl = "~/img/check_act.bmp";
                }
            }
        }
    }
}

2.に関してはとりあえず、教えていただいたように1.と同様の処理にしています
3.は無理すればできないこともない・・・というのはかなりやっかいと言うことでしょうか
  データベースの値を表示するコントロールが、
  都合のいいときだけ画面の値で動作しろというのは確かに虫が良すぎるかもしれないので、
  ここだけソートを無しにできないか検討してみます
  
  ただ、他の項目でソートしたときも、再度データベースから読み込んでしまうので
  できれば、この項目だけは2回目以降は画面から操作された状態を保持してはみたいと思っています
  このために、一時テーブルを作る・・・とかで回避出来るかもしれませんが

・EditItemTemplateというのが、テンプレートフィールドにあるので、もうちょっといじってみます

ありがとうございます
質問の書き方が悪かったです
1.に関しては、クリックしたらチェックの状態を変化させたいです
イメージボタンがあったのでそちらで試してみたのですが、
イメージボタンをクリックしたときに、クリックした時に押し込んだ状態のイメージにしようと思ったのですが、
クリックしたら、再度読み出してしまいました


aspxファイルのGridViewにテンプレートフィールドを追加した
```
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
	DataKeyNames="t1" DataSourceID="SqlDataSource1" AllowSorting="True" Height="115px" 
	onrowcreated="GridView1_RowCreated" Width="87px">
	<Columns>
		<asp:BoundField DataField="t1" HeaderText="t1" ReadOnly="True" 
			SortExpression="t1" />
		<asp:BoundField DataField="chStr" HeaderText="chStr" SortExpression="chStr" />
		<asp:BoundField DataField="ch" HeaderText="ch" SortExpression="ch" />
		<asp:CheckBoxField DataField="chBit" HeaderText="chBit" 
			SortExpression="chBit" />
		<asp:TemplateField SortExpression="chBit" HeaderText="chBitTmplt">
			<ItemTemplate>
				<asp:Label ID="Label1" runat="server" Text='<%# Eval("chStr") %>'></asp:Label>
				<asp:Image ID="Image1" runat="server" ImageUrl="~/img/check_no.bmp" />
				<asp:ImageButton ID="ImageButton1" runat="server" 
					ImageUrl="~/img/check_no.bmp" />
			</ItemTemplate>
		</asp:TemplateField>
	</Columns>
</asp:GridView>
```

csファイルRowCreatedにイメージ入れ替え処理追加
```
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
	//データ内容によって、チェックボックスを変化させる
	DataRowView d1 = (DataRowView)e.Row.DataItem;	//グリッドビューに結びついているデータ				

	if (d1 != null) {								
		var d = d1.Row["chBit"];					//chBitの状態をチェック
		int iCnt = e.Row.Cells[4].Controls.Count;
		//イメージで
		for (int i = 0; i < iCnt; i++) {
			//イメージボタン
			if (e.Row.Cells[4].Controls[i].ID == "ImageButton1") {
				ImageButton ib = (ImageButton)e.Row.Cells[4].Controls[i];
				if (d == null) {
					ib.Visible = false;
				} else if (d is DBNull) {
					ib.Visible = false;
				} else if ((bool)d == false) {
					ib.ImageUrl = "~/img/check_act.bmp";
				}
			}
			//イメージコントロール
			if (e.Row.Cells[4].Controls[i].ID == "Image1") {
				Image img = (Image)e.Row.Cells[4].Controls[i];
				if (d == null) {
					img.Visible = false;
				} else if (d is DBNull) {
					img.Visible = false;
				} else if ((bool)d == false) {
					img.ImageUrl = "~/img/check_act.bmp";
				}
			}
		}
	}
}
```
2.に関してはとりあえず、教えていただいたように1.と同様の処理にしています
3.は無理すればできないこともない・・・というのはかなりやっかいと言うことでしょうか
  データベースの値を表示するコントロールが、
  都合のいいときだけ画面の値で動作しろというのは確かに虫が良すぎるかもしれないので、
  ここだけソートを無しにできないか検討してみます
  
  ただ、他の項目でソートしたときも、再度データベースから読み込んでしまうので
  できれば、この項目だけは2回目以降は画面から操作された状態を保持してはみたいと思っています
  このために、一時テーブルを作る・・・とかで回避出来るかもしれませんが

・EditItemTemplateというのが、テンプレートフィールドにあるので、もうちょっといじってみます