Обновление C # CheckBoxList в SQL Server - PullRequest
0 голосов
/ 15 июля 2011

Пожалуйста, проверьте мой код C # ниже и дайте мне знать, где я иду не так. Вот что я испытываю:

1.) Если я очищаю столбец SendReport в SQL Server и загружаю страницу, вторая строка SendReport автоматически заполняется значением 1.

2.) Я могу поставить галочку, нажать кнопку, и значения SendReport будут успешно заполнены в SQL Server. Однако если я сниму флажок с любого из них и нажму кнопку, ни одно из значений не изменится с 1 на 0. Пожалуйста, помогите!

$<asp:CheckBoxList ID="CheckBoxList1" runat="server">
</asp:CheckBoxList>
<br />
<asp:Button ID="Button1" runat="server" Text="Save Changes" OnClick="Button1_Click" />
<br />


BACKPAGE:
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindCheckBoxList();
    }
}

//  Setting up the ConnectionString
public string GetConnectionString()
{
    return System.Configuration.ConfigurationManager.ConnectionStrings["IPdataConnectionString"].ConnectionString;
}

//  Binding the CheckBoxList with Data
private void BindCheckBoxList()
{
  DataTable dt = new DataTable();
  SqlConnection connection = new SqlConnection(GetConnectionString());
  try
  {
    connection.Open();
    string sqlStatement = "SELECT Partner, ID, SendReport FROM Rorts";
    SqlCommand sqlCmd = new SqlCommand(sqlStatement, connection);
    SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);

    sqlDa.Fill(dt);
    if (dt.Rows.Count > 0)
    {
      CheckBoxList1.DataSource = dt;
      CheckBoxList1.DataTextField = "Partner"; // the items to be displayed in the list items
      CheckBoxList1.DataValueField = "SendReport"; // the id of the items displayed
      CheckBoxList1.DataBind();

      //Setting the Selected Items in the ChecBoxList based from the value in the database
      //to do this, lets iterate to each items in the list
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        if (!string.IsNullOrEmpty(dt.Rows[i]["SendReport"].ToString()))
        {
          CheckBoxList1.Items[i].Selected = Convert.ToBoolean(dt.Rows[i]["SendReport"]);
        }
      }
    }

  }
  catch (System.Data.SqlClient.SqlException ex)
  {
    string msg = "Fetch Error:";
    msg += ex.Message;
    throw new Exception(msg);
  }
  finally
  {
    connection.Close();
  }
}

//  Creating the Method for Saving the CheckBoxList Selected Items to the database
private void Update(string name, bool SendReport)
{
  SqlConnection connection = new SqlConnection(GetConnectionString());
  SqlCommand cmd;
  string sqlStatement = string.Empty;
    try
    {
      // open the Sql connection
      connection.Open();
      sqlStatement = "UPDATE Rorts SET SendReport = @SendReport WHERE Partner = @Partner";
      cmd = new SqlCommand(sqlStatement, connection);
      cmd.Parameters.AddWithValue("@Partner", name);
      cmd.Parameters.AddWithValue("@SendReport", SendReport);
      cmd.CommandType = CommandType.Text;
      cmd.ExecuteNonQuery();

    }
    catch (System.Data.SqlClient.SqlException ex)
    {
      string msg = "Insert/Update Error:";
      msg += ex.Message;
      throw new Exception(msg);
    }
    finally
    {
      // close the Sql Connection
      connection.Close();
    }
  }

//  Calling the Method for Saving the state of  CheckBoxList  selected items
protected void Button1_Click(object sender, EventArgs e)
{
    string PartnerName = string.Empty;

  for (int i = 0; i < CheckBoxList1.Items.Count; i++)
  {
    if (CheckBoxList1.Items[i].Selected)
    {
        PartnerName = CheckBoxList1.Items[i].Text;
        Update(PartnerName, CheckBoxList1.Items[i].Selected);
    }
  }
  //ReBind the List to retain the selected items on postbacks
  BindCheckBoxList();
}

1 Ответ

1 голос
/ 23 июля 2011

Похоже, что проблема связана с блоком if ниже из обработчика события нажатия кнопки Button1. В результате значения, отмеченные только флажками, сохраняют значения в базе данных.

        if (CheckBoxList1.Items[i].Selected)
        {
            PartnerName = CheckBoxList1.Items[i].Text;
            Update(PartnerName, CheckBoxList1.Items[i].Selected);
        }

Вы можете просто удалить оператор if и сохранить все значения или добавить логику, чтобы сохранить только те, которые изменились.

...