I have a column in a gridview of checkboxes. I want to be able to display those boxes to be either checked or unchecked according to the corresponding value in the database (currently this column is not bound to any field, I'm having problems with that). Something that has been giving me problems is the fact that I'm using Ajax. when I do AutoPostBack = true, the checkbox appears checked for only a moment, and then when it refreshes everything the check disappears. Any help would be appreciated.
.CS
public partial class vieworders : System.Web.UI.Page
{
private string orderByString;
private string fieldString;
private string address;
private DataGrid dataGrid = new DataGrid();
protected void Page_Load(object sender, EventArgs e)
{
orderByString = orderByList.SelectedItem.Value;
fieldString = searchTextBox.Text;
string sqlStatement = "SELECT fName,lName,zip,email,cwaSource,price,length FROM SecureOrders WHERE fName LIKE '%" + fieldString + "%' OR lName LIKE'%" + fieldString + "%' OR zip LIKE'%" + fieldString + "%' OR zip LIKE'%" + fieldString + "%' OR email LIKE'%" + fieldString + "%' OR cwaSource LIKE'%" + fieldString + "%' OR length LIKE'%" + fieldString + "%' OR price LIKE'%" + fieldString + "%' ORDER BY " + orderByString;
////////////////////////////
System.Configuration.Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.
OpenWebConfiguration("/Cabot3");
System.Configuration.ConnectionStringSettings connectionString;
connectionString = rootWebConfig.ConnectionStrings.ConnectionStrings["secureodb"];
//TEST
for (int i = 0; i < DefaultGrid.Rows.Count; i++)
{
CheckBox chkUpdate = (CheckBox)DefaultGrid.Rows[i].Cells[1].FindControl("CheckBoxProcess");
if (chkUpdate != null)
{
OrderBrowser.Text += "Test";
}
}
// Create an SqlConnection to the database.
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
connection.Open();
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlStatement, connection);
// create an SqlCommandBuilder - this will automatically generate the
// commands, and set the appropriate properties in the dataAdapter
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
// create the DataSet
DataSet dataSet = new DataSet();
// fill the DataSet using our DataAdapter
dataAdapter.Fill(dataSet, "SecureOrders");
SqlCommand cmd = new SqlCommand("SELECT * FROM SecureOrders", connection); // might not need this
SqlCommand bitCmd = new SqlCommand("Select IsNull(processed,0) as processedField From SecureOrders", connection);
DataView source = new DataView(dataSet.Tables[0]);
DefaultGrid.DataSource = source;
DefaultGrid.DataBind();
}
}
protected void DefaultGrid_SelectedIndexChanged(Object sender, EventArgs e)
{
GridViewRow row = DefaultGrid.SelectedRow;
string name = "Name: " + row.Cells[2].Text + " " + row.Cells[3].Text + "\r\n";
// if (row.Cells[4].Text == " ")
//{
//address = "Address: " + row.Cells[3].Text + "\r\n " + row.Cells[5].Text + ", " + row.Cells[6].Text + " " + row.Cells[7].Text + " " + row.Cells[8].Text + "\r\n";
// }
//else
// {
// address = "Address: " + row.Cells[3].Text + "\r\n " + row.Cells[4].Text + "\r\n " + row.Cells[5].Text + ", " + row.Cells[6].Text + " " + row.Cells[7].Text + " " + row.Cells[8].Text + "\r\n";
//}
string zip = "Zip: " + row.Cells[4].Text + "\r\n";
string email = "Email: " + row.Cells[5].Text + "\r\n";
//string phone = "Phone: " + row.Cells[10].Text + "\r\n";
//string cctype = "Credit Card Type: " + row.Cells[11].Text + "\r\n";
//string ccnum = "Credit Card Number: " + row.Cells[12].Text + "\r\n";
//string ccexp = "Credit Card Expiration: " + row.Cells[13].Text + "\r\n";
string length = "Leng开发者_JS百科th: " + row.Cells[8].Text + "\r\n";
//string delivery = "Delivery: " + row.Cells[15].Text + "\r\n";
string price = "Price: " + row.Cells[7].Text + "\r\n";
string source = "Source: " + row.Cells[6].Text + "\r\n";
//string joined = "Joined: " + row.Cells[18].Text + "\r\n";
//string url = "URL: " + row.Cells[19].Text + "\r\n";
OrderBrowser.Text = name + email + length + price + source;
}
protected void CheckBoxProcess_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = (CheckBox)sender;
GridViewRow gr = (GridViewRow)cb.NamingContainer;
if (cb.Checked)
{
OrderBrowser.Text = "checked";
}
else
{
OrderBrowser.Text = "unchecked";
}
}
}
.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="vieworders.aspx.cs" Inherits="Cabot3.custserv.vieworders" %>
<asp:DropDownList runat="server" ID="orderByList" AutoPostBack="true">
<asp:ListItem Value="fName" Selected="True">First Name</asp:ListItem>
<asp:ListItem Value="lName">Last Name</asp:ListItem>
<asp:ListItem Value="state">State</asp:ListItem>
<asp:ListItem Value="zip">Zip Code</asp:ListItem>
<asp:ListItem Value="cwaSource">Source</asp:ListItem>
<asp:ListItem Value="cwaJoined">Date Joined</asp:ListItem>
</asp:DropDownList>
</div>
<div>
<asp:Label runat="server" ID="searchLabel" Text="Search For: " />
<asp:TextBox ID="searchTextBox" runat="server" Columns="30" />
<asp:Button ID="searchButton" runat="server" Text="Search" />
</div>
<div>
<asp:UpdatePanel ID = "up" runat="server">
<ContentTemplate>
<div style= "overflow:auto; height:150px; width:700px">
<asp:GridView ID="DefaultGrid" runat = "server" DataKeyNames = "fName, lName, zip"
onselectedindexchanged = "DefaultGrid_SelectedIndexChanged"
autogenerateselectbutton = "true"
selectedindex="0">
<SelectedRowStyle BackColor="Azure"
forecolor="Black"
font-bold="true" />
<Columns>
<asp:TemplateField HeaderText="Processed">
<ItemTemplate>
<asp:CheckBox ID="CheckBoxProcess" OnCheckedChanged="CheckBoxProcess_CheckedChanged" runat="server" Enabled="true" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
<asp:TextBox ID="OrderBrowser" columns="70" Rows="14" runat="server" Wrap="false" TextMode="MultiLine" ReadOnly = "true"/>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
Its because when you click on the checkbox, During the AJAX postaback, your page_load
event fires before CheckBoxProcess_CheckedChanged
where your Gridview is binded again.
It should be like...
If(!IsPostBack) // you missed this condition
{
orderByString = orderByList.SelectedItem.Value;
fieldString = searchTextBox.Text;
string sqlStatement = "SELECT fName,lName,zip,email,cwaSource,price,length FROM SecureOrders WHERE fName LIKE '%" + fieldString + "%' OR lName LIKE'%" + fieldString + "%' OR zip LIKE'%" + fieldString + "%' OR zip LIKE'%" + fieldString + "%' OR email LIKE'%" + fieldString + "%' OR cwaSource LIKE'%" + fieldString + "%' OR length LIKE'%" + fieldString + "%' OR price LIKE'%" + fieldString + "%' ORDER BY " + orderByString;
////////////////////////////
System.Configuration.Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.
OpenWebConfiguration("/Cabot3");
System.Configuration.ConnectionStringSettings connectionString;
connectionString = rootWebConfig.ConnectionStrings.ConnectionStrings["secureodb"];
//TEST
for (int i = 0; i < DefaultGrid.Rows.Count; i++)
{
CheckBox chkUpdate = (CheckBox)DefaultGrid.Rows[i].Cells[1].FindControl("CheckBoxProcess");
if (chkUpdate != null)
{
OrderBrowser.Text += "Test";
}
}
// Create an SqlConnection to the database.
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
connection.Open();
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlStatement, connection);
// create an SqlCommandBuilder - this will automatically generate the
// commands, and set the appropriate properties in the dataAdapter
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
// create the DataSet
DataSet dataSet = new DataSet();
// fill the DataSet using our DataAdapter
dataAdapter.Fill(dataSet, "SecureOrders");
SqlCommand cmd = new SqlCommand("SELECT * FROM SecureOrders", connection); // might not need this
SqlCommand bitCmd = new SqlCommand("Select IsNull(processed,0) as processedField From SecureOrders", connection);
DataView source = new DataView(dataSet.Tables[0]);
DefaultGrid.DataSource = source;
DefaultGrid.DataBind();
}
}
Edit: After following your comments, you don't need to iterate the gridiew rows to set the checkbox state. You can either use the RowDataBound event of GridView or directly bind the value. e.g.
<asp:CheckBox ID="CheckBoxProcess" Checked='<%#Eval("processedField") %>' OnCheckedChanged="CheckBoxProcess_CheckedChanged" runat="server" Enabled="true" />
Update: Please change the following code with this one
// Create an SqlConnection to the database.
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
connection.Open();
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM SecureOrders", connection);
// create the DataSet
DataSet dataSet = new DataSet();
// fill the DataSet using our DataAdapter
dataAdapter.Fill(dataSet, "SecureOrders");
DataView source = new DataView(dataSet.Tables[0]);
DefaultGrid.DataSource = source;
DefaultGrid.DataBind();
}
精彩评论