Question

I have a gridview that is SQL bound. In some of the columns there are bit values. When I use C# to get the values into the gridview, checkboxes are displayed. I need to extract the value of that column into text.

    SqlConnection sConnection = new SqlConnection(MyConnectionString);
    SqlCommand sCommand = new SqlCommand();
    using (sConnection)
    {
        sCommand.Connection = sConnection;
        sCommand.CommandText = "MyStoredProcedure";
        sCommand.CommandType = CommandType.StoredProcedure;
        sCommand.Connection.Open();
        SqlDataReader reader = sCommand.ExecuteReader();
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                gridView.DataSource = reader;
                gridView.DataBind();
            }
            for (int i = 0; i < gridView.Rows.Count; i++)
            {
                ListBox1.Items.Add(gridView.Rows[i].Cells[3].Text);
            }
        }
    }

The gridview column data type is 'bit'. I do not have access to the database or stored procedure to change anything there. I need to somehow extract the '0' or '1' value, but when I do it like above, the text is blank.

I also tried to use 'GetOrdinal'. It returned a True/False value from the database, but I could not figure out how to get the value for each item in the gridview.

    if (!reader.IsDBNull(reader.GetOrdinal("MyColumn1")))
    {
        ListBox1.Items.Add(reader.GetOrdinal("MyColumn1").ToString());
    }
Was it helpful?

Solution

General overview:

  • You need to be able to find the CheckBox that's generated and get the value of it's "Checked" property.

  • To do this, you need to be able to use the FindControl() method on the GridViewRow.

  • To use FindControl, the CheckBox needs a predictable name.
  • To get a predictable name, you need to have that column be a TemplateColumn so that you can specify the name of the CheckBox in the markup on the ASPX page.

There's a full working set of code here: http://www.codeproject.com/Articles/25056/The-RIGHT-Way-to-Use-Checkboxes-in-a-NET-Repeater

This shows the code for a Repeater, but it's the same principle and general code for any DataBound control.

The code below should work with modifications to match your DB names:

 <asp:TemplateField> 
   <ItemTemplate > 
       <asp:checkbox id="MyColumnNameCheckbox" runat="server" /> 
   </ItemTemplate> 
 </asp:TemplateField> 

    string defaultvalue = "0"; // To be used to display the value of the original bit field.
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     CheckBox chkBx = (CheckBox)row.FindControl("MyColumnNameCheckbox"); 

        if (chkBx != null && chkBx.Checked) 
        { 
            defaultvalue = "1";
        } 
    } 

OTHER TIPS

I was able to figure it out. Thanks, David Stratton, for pointing me in the right direction. I did it by assigning an id to the dynamically created control first. then did the FindControl()...

Control ctrl = GridView1.SelectedRow.Cells[4].Control[0];
ctrl.ID = "ctrl";
Boolean result = Convert.ToBoolean(((Checkbox)GridView1.Rows[0].Cells[4].FindControl("ctrl")).Checked);
TextBox1.Text = result.ToString();

This returns a value of "True" or "False"...

Thanks again.

Another way to resolve it:

bool result = (GridView1.SelectedRow.Cells[4].Control[0] as Checkbox).Checked;
TextBox1.Text = result.ToString();

it resolve the problem with less code :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top