Using a CheckBox in a DataGrid to Update a Bit Type Data Field

N

Nu2ASP.NET

What I am trying to do is essentially 'flip' the bits, when the user
clicks in the checkbox. For example, if the CheckBox appears checked,
and the user un-checks it, I want the underlying data field to change
from a "1" to a "0" (and vica versa).

I have the bindings worked out, I just can't figure out how to do the
update.

Here is my source:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false" Inherits="CheckBoxTest.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<ASP:DATAGRID id="MyDataGrid" runat="server"
AutoGenerateColumns="false"
HeaderStyle-BackColor="#aaaadd" Font-Size="8pt"
Font-Name="Verdana"
CellSpacing="0" CellPadding="3" ShowFooter="false"
BorderColor="black"
BackColor="#ccccff" Width="800"
OnItemDataBound="MyDataGrid_ItemDataBound">
<Columns>
<asp:BoundColumn HeaderText="au_id" DataField="au_id"/>
<asp:BoundColumn HeaderText="au_lname"
DataField="au_lname" />
<asp:TemplateColumn HeaderText="au_fname">
<ItemTemplate>
<asp:Label id="au_fname" Text='<%#
DataBinder.Eval(Container.DataItem,
"au_fname") %>' runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn HeaderText="city" DataField="city" />
<asp:TemplateColumn HeaderText="contract">
<HeaderTemplate>
<input type="checkbox" id="checkAll" runat="server">
Contracts
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox id="contract" AutoPostBack=True
runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</ASP:DATAGRID></form>
</body>
</HTML>

Code behind:


using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

namespace CheckBoxTest
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid MyDataGrid;
SqlConnection myConnection;



private void Page_Load(object sender, System.EventArgs e)
{
myConnection = new SqlConnection

("Server=localhost;uid=sa;pwd=preview;database=pubs");


if(!IsPostBack)
BindGrid();
}

public void MyDataGrid_ItemDataBound(object sender,
System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem)
{
CheckBox cb = e.Item.FindControl("contract")as CheckBox;
DataRowView drv = (DataRowView)e.Item.DataItem;

if(cb != null && !drv.Row.IsNull("contract"))
{
cb.Checked = (bool)drv["contract"];
}
}

}


public void BindGrid()
{
SqlDataAdapter dAdapter = new SqlDataAdapter ("SELECT * FROM
authors ",
myConnection);
DataSet dSet= new DataSet();
dAdapter.Fill(dSet, "authors");
MyDataGrid.DataSource = dSet.Tables["authors"].DefaultView;
MyDataGrid.DataBind();
}


#region Web Form Designer generated code

override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form
Designer.
//

InitializeComponent();
base.OnInit(e);


}


/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>

private void InitializeComponent()
{
this.MyDataGrid.ItemDataBound += new
System.Web.UI.WebControls.DataGridItemEventHandler
(this.MyDataGrid_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}

#endregion
}

}

I am using a SQL 2000 database (note I'm using the sample pubs database
above).

As always, help is greatly appreciated!!!
 
G

Guest

add an event handler to your checkbox: OnCheckedChanged ="MyFunction" and in
the method that handles the event do the opposite of what you did in the
MyDataGrid_ItemDataBound (i.e. drv["contract"]=cb.Checked ;)

I have a complete sample code for a similar usage (to delete instead of
update):http://www.societopia.net/Samples/DataGrid_ChildControlsEvents.aspx
--
[note: if this post answers your question, you can mark it as an answer
using the web-based newsreader functions]
-----
HTH,
Phillip Williams
http://www.societopia.net
http://www.webswapp.com


Nu2ASP.NET said:
What I am trying to do is essentially 'flip' the bits, when the user
clicks in the checkbox. For example, if the CheckBox appears checked,
and the user un-checks it, I want the underlying data field to change
from a "1" to a "0" (and vica versa).

I have the bindings worked out, I just can't figure out how to do the
update.

Here is my source:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false" Inherits="CheckBoxTest.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<ASP:DATAGRID id="MyDataGrid" runat="server"
AutoGenerateColumns="false"
HeaderStyle-BackColor="#aaaadd" Font-Size="8pt"
Font-Name="Verdana"
CellSpacing="0" CellPadding="3" ShowFooter="false"
BorderColor="black"
BackColor="#ccccff" Width="800"
OnItemDataBound="MyDataGrid_ItemDataBound">
<Columns>
<asp:BoundColumn HeaderText="au_id" DataField="au_id"/>
<asp:BoundColumn HeaderText="au_lname"
DataField="au_lname" />
<asp:TemplateColumn HeaderText="au_fname">
<ItemTemplate>
<asp:Label id="au_fname" Text='<%#
DataBinder.Eval(Container.DataItem,
"au_fname") %>' runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn HeaderText="city" DataField="city" />
<asp:TemplateColumn HeaderText="contract">
<HeaderTemplate>
<input type="checkbox" id="checkAll" runat="server">
Contracts
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox id="contract" AutoPostBack=True
runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</ASP:DATAGRID></form>
</body>
</HTML>

Code behind:


using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

namespace CheckBoxTest
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid MyDataGrid;
SqlConnection myConnection;



private void Page_Load(object sender, System.EventArgs e)
{
myConnection = new SqlConnection

("Server=localhost;uid=sa;pwd=preview;database=pubs");


if(!IsPostBack)
BindGrid();
}

public void MyDataGrid_ItemDataBound(object sender,
System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem)
{
CheckBox cb = e.Item.FindControl("contract")as CheckBox;
DataRowView drv = (DataRowView)e.Item.DataItem;

if(cb != null && !drv.Row.IsNull("contract"))
{
cb.Checked = (bool)drv["contract"];
}
}

}


public void BindGrid()
{
SqlDataAdapter dAdapter = new SqlDataAdapter ("SELECT * FROM
authors ",
myConnection);
DataSet dSet= new DataSet();
dAdapter.Fill(dSet, "authors");
MyDataGrid.DataSource = dSet.Tables["authors"].DefaultView;
MyDataGrid.DataBind();
}


#region Web Form Designer generated code

override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form
Designer.
//

InitializeComponent();
base.OnInit(e);


}


/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>

private void InitializeComponent()
{
this.MyDataGrid.ItemDataBound += new
System.Web.UI.WebControls.DataGridItemEventHandler
(this.MyDataGrid_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}

#endregion
}

}

I am using a SQL 2000 database (note I'm using the sample pubs database
above).

As always, help is greatly appreciated!!!
 
N

Nu2ASP.NET

Thank You Phillip!

Your example is a very good one: I am, however, having trouble with the
syntax for the update query. I am trying to update the contract field
(bit data type) in the pubs database. I made several attempts, using the
SQL Query analyzer, but couldn't get the syntax right. Could you
possibly provide me with a sample? I would really appreciate it.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top