我有这个如此受欢迎的问题,我真的无法解决。 即使我在网上搜索了很多内容,我还没有找到解决方案,所以请不要将其标记为重复,因为它不是。 这是我想要做的: 我基于XML文件创建了一个GridView,因此我根据它创建了列和行。 每个单元格都有一个可以检查的复选框,具体取决于xml中的一些vaules。 我可以选中或取消选中复选框,但这里出现问题。 如果没有选中复选框并且我点击它一切顺利,当它被选中并且我想取消选中它时,复选框只是更改它的检查而不执行它应该执行的操作(并且它导致其状态没有改变)。 我怎样才能解决这个问题?真的很烦人。
这是一些代码,对不起,如果它不那么可读或做得好。
public partial class AggiungiDisponibilita : System.Web.UI.Page
{
string nomeProclamatore;
string id;
string colonna, colonna_c2, colonna_c3, riga, riga_c2, riga_c3;
/// <summary>
/// stringe per l'inserimento delle disponibilita
/// </summary>
string data, turno;
string prog, name;
string mese_prossimo = Home.mese_prossimo;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["UserName"] != null)
{
if (!Session["UserName"].Equals("JonathanImperato"))
{
Gestione.Visible = false;
Homes.Text = "Logout";
}
if (!Session["UserName"].Equals(Request.QueryString["Name"]))
{
Response.Redirect("Login.aspx", false);
}
prog = Server.MapPath(Resources.DisponibilitaXML);
Mese.Text = "Disponibilita per il mese di: " + Variables.Mese_Succ(DateTime.Now.Month);
name = Request.QueryString["Name"];
id = name;
nomeProclamatore = name.Replace("+", " ");
nome.Text = nomeProclamatore;
}
else Response.Redirect("Login.aspx", false);
}
void loadData()
{
// instantiate XmlDocument and load XML from file
XmlDocument doc = new XmlDocument();
doc.Load(prog); //Percorso file xml
DataTable dt = new DataTable();
dt.Columns.Add("Data");
foreach (XmlNode xns in doc.DocumentElement)
{
if (xns.Name == Variables.Mese_Succ(DateTime.Now.Month)) ///IMPLEMENTARE SELEZIONE AUTOMATICA DEL MESE IMPORTANTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
foreach (XmlNode xn in xns)
{
string tagName = xn.Name;
dt.Rows.Add(tagName);
}
}
dt.Columns.Add("Mattina Turno 1", typeof(Boolean));
dt.Columns.Add("Mattina Turno 2", typeof(Boolean));
dt.Columns.Add("Pomeriggio", typeof(Boolean));
GridView1.DataSource = dt;
GridView1.DataBind();
//nascondo tutti i checkbox i cui turni non esistono una volta che tutti i checkbox sono stati inseriti nella GridView
for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++)
{
foreach (GridViewRow row in GridView1.Rows)
{
foreach (CheckBox checks in row.Cells[i].Controls)
{
int tooltip_lunghezza = checks.ToolTip.Split(',').Count();
if (tooltip_lunghezza != 2)
{
var programma = new XmlDocument();
programma.Load(Server.MapPath(Resources.ProgrammaXML));
var mese = programma.DocumentElement.SelectSingleNode(Variables.Mese_Succ(DateTime.Now.Month));
// MOSTRA IN AUTOMATICO SOLO I TURNI CHE OGNI GIORNO HA NEL FILE XML, AUTOMATICITA SENZA CONTROLLO DI OGNI GIORNO, FA TUTTO SULLA BASE DELL'EXML
//FUNZIONA ANCHE CON I GIORNI AGGIUNTI SUCCESSIVAMENTE
string data2 = row.Cells[0].Text;
XmlNode giorno = mese.SelectSingleNode(data2);
checks.Visible = false;
foreach (XmlNode turni in giorno.ChildNodes)
{
string nome_turno = turni.Name;
if (checks.ToolTip.Contains(turni.Name.Replace("_", " ")) && checks.ToolTip.Contains(data2))
checks.Visible = true;
}
}
else checks.Visible = false; //nascondo quelli finti
}
}
}
}
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
{
prog = Server.MapPath(Resources.DisponibilitaXML);
id = Request.QueryString["Name"];
nomeProclamatore = id.Replace("%20", " ");
nome.Text = nomeProclamatore;
nome.Text = mese_prossimo;
loadData();
}
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
inserisciDisponibilitaGiaDate(e);
}
void inserisciDisponibilitaGiaDate(GridViewRowEventArgs e)
{
string test;
CheckBox chk1 = new CheckBox();
CheckBox chk2 = new CheckBox();
CheckBox chk3 = new CheckBox();
prog = Server.MapPath(Resources.DisponibilitaXML);
var doc = XElement.Load(prog); //Percorso file xml
//foreach(GridViewRow row in GridView1.Rows)
// check if it's not a header and footer
if (e.Row.RowType == DataControlRowType.DataRow)
{
Variables.data_turno = test = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Data"));
test = Variables.data_turno;
Variables.row_index = Convert.ToInt32(e.Row.RowIndex);
chk1.CausesValidation = false;
chk1.AutoPostBack = true;
chk1.Checked = false;
chk1.CheckedChanged += new EventHandler(Cb_CheckedChanged);
colonna = GridView1.HeaderRow.Cells[1].Text;
chk1.ID = colonna + e.Row.RowIndex;
chk1.ViewStateMode = ViewStateMode.Enabled;
chk1.ToolTip = Variables.row_index + "," + test + "," + colonna + ",false";
//se è gia stata data la disponibilita metto il checkbox su cliccato
if (test.Length > 0 && colonna.Length > 0)
{
var saveGame = doc
//.Element("Anno_"+DateTime.Now.Year.ToString())
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(test.Replace(" ", "_"))
.Elements(colonna.Replace(" ", "_"))
.Single();
string esiste_gia = saveGame.Value;
if (esiste_gia.Contains(nomeProclamatore))
{
chk1.Checked = true;
chk1.ToolTip = Variables.row_index + "," + test + "," + colonna + ",true";
}
}
//--------------------------------------------
chk2.CausesValidation = false;
chk2.AutoPostBack = true;
chk2.Checked = false;
chk2.ViewStateMode = ViewStateMode.Enabled;
chk2.CheckedChanged += new EventHandler(Cb_CheckedChanged);
colonna_c2 = GridView1.HeaderRow.Cells[2].Text;
chk2.ID = colonna_c2 + e.Row.RowIndex;
chk2.ToolTip = Variables.row_index + "," + test + "," + colonna_c2 + ",false";
//se è gia stata data la disponibilita metto il checkbox su cliccato
if (test.StartsWith("mer") && !test.Contains("B"))
{
var saveGame2 = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(test.Replace(" ", "_"))
.Elements(colonna_c2.Replace(" ", "_"))
.Single();
if (saveGame2.Value != null && saveGame2.Value.Contains(nomeProclamatore))
{
chk2.ToolTip = Variables.row_index + "," + test + "," + colonna_c2 + ",true";
chk2.Checked = true;
}
}
//--------------------------------------------
chk3.CausesValidation = false;
chk3.AutoPostBack = true;
chk3.ViewStateMode = ViewStateMode.Enabled;
chk3.CheckedChanged += new EventHandler(Cb_CheckedChanged);
colonna_c3 = GridView1.HeaderRow.Cells[3].Text;
chk3.ID = colonna_c3 + e.Row.RowIndex;
chk3.Checked = false;
chk3.ToolTip = Variables.row_index + "," + test + "," + colonna_c3 + ",false";
if (test.StartsWith("sab") && !test.Contains("B") || test.StartsWith("dom") && !test.Contains("B"))
{
//se è gia stata data la disponibilita metto il checkbox su cliccato
var saveGame3 = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(test.Replace(" ", "_"))
.Elements(colonna_c3.Replace(" ", "_"))
.Single();
if (saveGame3.Value != null && saveGame3.Value.Contains(nomeProclamatore))
{
chk3.Checked = true;
chk3.ToolTip = Variables.row_index + "," + test + "," + colonna_c3 + ",true";
}
}
// if (!test.StartsWith("sab")) // aggiungo il terzo check
// chk3.Enabled = false;
//PER I GIORNI ECCEZIONALI, INSERISCO IL CHECKBOX ATTIVO SE è GIA STATA DATA LA DISPONIBILITA.........
if (test.StartsWith("lun") || test.StartsWith("gio") || test.Contains("B")) //quindi sono giorni aggiunti manualmente
{
//VISUALIZZO CHE TURNI SONO STATI IMPOSTATI QUANDO è STATO AGGIUNTO IL GIORNO
var programma = new XmlDocument();
programma.Load(Server.MapPath(Resources.DisponibilitaXML));
var mese = programma.DocumentElement.SelectSingleNode(Variables.Mese_Succ(DateTime.Now.Month));
var giorno = mese.SelectSingleNode(test);
foreach (XmlNode turni in giorno.ChildNodes)
{
string nome_turno = turni.Name;
//se è gia stata data la disponibilita metto il checkbox su cliccato
var saveGame4 = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(test.Replace(" ", "_"))
.Elements(nome_turno.Replace(" ", "_"))
.Single();
if (nome_turno == "Mattina_Turno_1" && saveGame4.Value != null && saveGame4.Value.Contains(nomeProclamatore))
{
chk1.Checked = true;
chk1.ToolTip = Variables.row_index + "," + test + "," + colonna_c3 + ",true";
}
if (nome_turno == "Mattina_Turno_2" && saveGame4.Value != null && saveGame4.Value.Contains(nomeProclamatore))
{
chk2.Checked = true;
chk2.ToolTip = Variables.row_index + "," + test + "," + colonna_c3 + ",true";
}
if (nome_turno == "Pomeriggio" && saveGame4.Value != null && saveGame4.Value.Contains(nomeProclamatore))
{
chk3.Checked = true;
chk3.ToolTip = Variables.row_index + "," + test + "," + colonna_c3 + ",true";
}
}
}
e.Row.Cells[1].Controls.Add(chk1); // add checkbox to second column
e.Row.Cells[2].Controls.Add(chk2); // aggiungo il secondo check
e.Row.Cells[3].Controls.Add(chk3); //il terzo
}
}
bool isFirstCheckClick = true;
bool isXmlOpened = false; //variabile per vedere se sto già aggiungendo una disponibilita, serve a non mandare in crash
private void Cb_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = ((CheckBox)sender);
bool isChecked = checkBox.Checked;
nome.Text = checkBox.ToString() + isChecked.ToString();
if (!isXmlOpened && sender != null)
{
{
isXmlOpened = true;
string info = ((CheckBox)sender).ToolTip.ToString();
string[] selezione = info.Split(',');
string data_selezione = selezione[0];
string turno_selezione = selezione[2];
id = Request.QueryString["Name"];
id = id.Replace("+", " ");
data_selezione = GridView1.Rows[Convert.ToInt32(data_selezione)].Cells[0].Text;
turno_selezione = turno_selezione.Replace(" ", "_");
//verifico che è un giorno che ha il pomeriggio se è stato selezionato il pomeriggio
if (turno_selezione != "Pomeriggio" && turno_selezione != "Mattina_Turno_2" || turno_selezione == "Pomeriggio" && data_selezione.StartsWith("dom") || turno_selezione == "Pomeriggio" && data_selezione.StartsWith("sab") || turno_selezione == "Mattina_Turno_2" && data_selezione.StartsWith("mer"))
{
//l'ho appena selezionato quindi voglio aggiungere il nome
if (isChecked || ((CheckBox)sender).Checked || selezione[3] == "true")
{
var doc = XElement.Load(prog); //Percorso file xml
//da scegliere se usare metodo sopra o sotto
var saveGame = doc
//.Element("Anno_"+DateTime.Now.Year.ToString())
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione)
.Single();
saveGame.Value += nome.Text + ",";
doc.Save(prog);
checkBox.Checked = true;
//ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Aggiunto con successo il giorno'" + data_selezione + ")", true);
}
else //if (selezione[3] == "false")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione.Trim())
.Single();
string remove = saveGame.Value.ToString();
saveGame.Value = remove.Replace((nome.Text + ","), ""); //in teoria dovrebbe rimuovere il nome
doc.Save(prog);
}
//else Cb_CheckedChanged(checkBox, null);
// else Response.Write(selezione[3] + ((CheckBox)sender).Checked.ToString());
}
else if (data_selezione.StartsWith("lun") || data_selezione.StartsWith("gio"))
{
if (((CheckBox)sender).Checked || selezione[3] == "true")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
//.Element("Anno_"+DateTime.Now.Year.ToString())
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione)
.Single();
saveGame.Value += nome.Text + ",";
doc.Save(prog);
//ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Aggiunto con successo il giorno'" + data_selezione + ")", true);
}
else if (selezione[3] == "false")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione.Trim())
.Single();
string remove = saveGame.Value.ToString();
saveGame.Value = remove.Replace((nome.Text + ","), ""); //in teoria dovrebbe rimuovere il nome
doc.Save(prog);
}
else Response.Write(selezione[3] + ((CheckBox)sender).Checked.ToString());
}
else
{
//ClientScript.RegisterStartupScript(this.GetType(), "Non esiste", "alert('Non esiste il turno " + turno_selezione + " per il giorno "+ data_selezione +".')", true);
// loadData();
// Response.Redirect(
// "AggiungiDisponibilita.aspx?Name=" + id.Replace(" ", "+"));
}
isXmlOpened = false;
// setCheckedAgain(((CheckBox)sender).ID);
}
}
}
}
这里的检查部分:
private void Cb_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = ((CheckBox)sender);
bool isChecked = checkBox.Checked;
nome.Text = checkBox.ToString() + isChecked.ToString();
if (!isXmlOpened && sender != null)
{
{
isXmlOpened = true;
string info = ((CheckBox)sender).ToolTip.ToString();
string[] selezione = info.Split(',');
string data_selezione = selezione[0];
string turno_selezione = selezione[2];
id = Request.QueryString["Name"];
id = id.Replace("+", " ");
data_selezione = GridView1.Rows[Convert.ToInt32(data_selezione)].Cells[0].Text;
turno_selezione = turno_selezione.Replace(" ", "_");
//verifico che è un giorno che ha il pomeriggio se è stato selezionato il pomeriggio
if (turno_selezione != "Pomeriggio" && turno_selezione != "Mattina_Turno_2" || turno_selezione == "Pomeriggio" && data_selezione.StartsWith("dom") || turno_selezione == "Pomeriggio" && data_selezione.StartsWith("sab") || turno_selezione == "Mattina_Turno_2" && data_selezione.StartsWith("mer"))
{
//l'ho appena selezionato quindi voglio aggiungere il nome
if (isChecked || ((CheckBox)sender).Checked || selezione[3] == "true")
{
var doc = XElement.Load(prog); //Percorso file xml
//da scegliere se usare metodo sopra o sotto
var saveGame = doc
//.Element("Anno_"+DateTime.Now.Year.ToString())
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione)
.Single();
saveGame.Value += nome.Text + ",";
doc.Save(prog);
checkBox.Checked = true;
//ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Aggiunto con successo il giorno'" + data_selezione + ")", true);
}
else //if (selezione[3] == "false")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione.Trim())
.Single();
string remove = saveGame.Value.ToString();
saveGame.Value = remove.Replace((nome.Text + ","), ""); //in teoria dovrebbe rimuovere il nome
doc.Save(prog);
}
//else Cb_CheckedChanged(checkBox, null);
// else Response.Write(selezione[3] + ((CheckBox)sender).Checked.ToString());
}
else if (data_selezione.StartsWith("lun") || data_selezione.StartsWith("gio"))
{
if (((CheckBox)sender).Checked || selezione[3] == "true")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
//.Element("Anno_"+DateTime.Now.Year.ToString())
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione)
.Single();
saveGame.Value += nome.Text + ",";
doc.Save(prog);
//ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Aggiunto con successo il giorno'" + data_selezione + ")", true);
}
else if (selezione[3] == "false")
{
var doc = XElement.Load(prog); //Percorso file xml
var saveGame = doc
.Element(Variables.Mese_Succ(DateTime.Now.Month))
.Elements(data_selezione)
.Elements(turno_selezione.Trim())
.Single();
string remove = saveGame.Value.ToString();
saveGame.Value = remove.Replace((nome.Text + ","), ""); //in teoria dovrebbe rimuovere il nome
doc.Save(prog);
}
else Response.Write(selezione[3] + ((CheckBox)sender).Checked.ToString());
}
else
{
//ClientScript.RegisterStartupScript(this.GetType(), "Non esiste", "alert('Non esiste il turno " + turno_selezione + " per il giorno "+ data_selezione +".')", true);
// loadData();
// Response.Redirect(
// "AggiungiDisponibilita.aspx?Name=" + id.Replace(" ", "+"));
}
isXmlOpened = false;
// setCheckedAgain(((CheckBox)sender).ID);
}
}
}
我解释了一些方法: loadData()使用所需的行和列创建gridview。 inserisciDisponibilitaGiaDate()设置复选框值,如果应该检查它们,应该选择哪个。 Cb_CheckedChanged()是触发复选框状态更改的方法。 提前谢谢。