2013-02-14 69 views
0

我从我之前的问题开始,因为我从来没有得到完整的回复。 Reference previous object created in loop to update SQL数组设置复选框并将结果保存到SQL

基本上,我已经改变了我的语法以下,但有两个问题是:

  1. 复选框并没有真正出现。
  2. 在saveOrderBtn_Click循环中,我收到错误消息“名称'myBoxes'在当前上下文中不存在”。这是在“if”语句行上。

我不能使用Controls.Add(myCheckBox);因为当您执行更新时,会根据循环中创建的最后一个复选框更新SQL中的所有内容 - 它不会计算每个复选框。

我仍在学习C#。先进的非常感谢。

更新的代码:

public partial class SelectUsers : Form { 

// DECLARE THE myCheckBox 
private CheckBox myCheckBox; 

public SelectUsers() 
{ 
    InitializeComponent(); 
} 

private void SelectUsers_Load(object sender, EventArgs e) 
{ 
    DataSet ds = myconnection.runSelect(new DataSet(), "THE SELECT"); 

    int xAxisCheckbox = 40; 
    int yAxisCheckbox = 50; 

    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
     // CHANGED List<CheckBox> myBoxes LINE 
     List<CheckBox> myBoxes = new List<CheckBox>(); 

     myCheckBox = new CheckBox(); 
     myCheckBox.Location = new Point(xAxisCheckbox, yAxisCheckbox); 
     myCheckBox.Size = new Size(120, 20); 
     myCheckBox.Text = ds.Tables[0].Rows[i]["FullName"].ToString(); 
     myCheckBox.Checked = (bool)ds.Tables[0].Rows[i]["InOperation"]; 
     yAxisCheckbox = yAxisCheckbox + 80; 

     // THIS SHOULD ADD/RENDER EACH CHECKBOX, BUT IT DOESN'T 
     myBoxes.Add(myCheckBox); 
    } 
} 

private void saveBtn_Click(object sender, EventArgs e) 
{ 
    DataSet ds = myconnection.runSelect(new DataSet(), "THE SELECT"); 

    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
     userID = (int)ds.Tables[0].Rows[i]["UserID"]; 
     if (myBoxes[i].Checked) 
     { 
      myconnection.runUpdate("UPDATE Users SET InOperation = 1, OperationOrder = CASE WHEN OperationOrder = 1 THEN 1 ELSE CASE WHEN InOperation=1 THEN OperationOrder ELSE (SELECT COUNT(*)+1 FROM Users WHERE InOperation=1 AND OperationOrder > 0) END END WHERE UserID=" + userID); 
      myconnection.runUpdate("UPDATE Users SET OperationOrder = CASE WHEN OperationOrder = 0 THEN (SELECT COUNT(*) FROM Users WHERE InOperation=1) ELSE OperationOrder END WHERE InOperation=1"); 
     } 
     else 
     { 
      myconnection.runUpdate("UPDATE Users SET InOperation = 0, OperationOrder = 0 WHERE UserID=" + userID); 
      myconnection.runUpdate("UPDATE Users SET OperationOrder = CASE WHEN OperationOrder -1 = 0 THEN (SELECT COUNT(*) FROM Users WHERE InOperation=1) ELSE OperationOrder -1 END WHERE InOperation=1"); 
     } 
    } 
} 
} 
+0

你之外myBoxes的声明循环将使它在myBoxes的所有位置都有完全相同的复选框(因为您不断重新定义相同的复选框)。使用myBoxes将项目呈现给页面的代码在哪里?您的保存还取决于数据库在加载和保存之间没有变化。 – 2013-02-14 19:59:01

+0

@EricH感谢您的回复。那么更新后的代码示例是否可以用于声明myBoxes(请参见上文)?我发布的代码是一切都可以使复选框工作,虽然它显然不工作,所以我想我需要更多的代码来呈现复选框,而不仅仅是“myBoxes.Add(myCheckBox);”?请问我可以举个例子让他们展示吗?并且数据库不太可能在加载和保存按钮点击之间改变。谢谢 – user1779775 2013-02-15 11:48:40

回答

0

阅读编程书籍后,我发现,你不创造这样的,它是在下面的方式做了一个数组:

// Global 
CheckBox[] myCheckBox; 
DataSet ds; 

private void SelectUsers_Load(object sender, EventArgs e) { 

    ds = myconnection.runSelect(new DataSet(), "THE SELECT"); 

    int xAxisCheckbox = 40; 
    int yAxisCheckbox = 50; 

    // Create the CheckBox array (amount based on number of rows) 
    myBoxes = new CheckBox[ds.Tables[0].Rows.Count]; 

    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
     // Create a new Checkbox 
     myCheckBox[i] = new CheckBox(); 

     myCheckBox.Location = new Point(xAxisCheckbox, yAxisCheckbox); 
     myCheckBox.Size = new Size(120, 20); 
     myCheckBox.Text = ds.Tables[0].Rows[i]["FullName"].ToString(); 
     myCheckBox.Checked = (bool)ds.Tables[0].Rows[i]["InOperation"]; 
     yAxisCheckbox = yAxisCheckbox + 80; 

     // Add the Checkbox 
     Controls.Add(myCheckBox[i]); 
    } 
} 

private void saveBtn_Click(object sender, EventArgs e) { 
    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
     userID = (int)ds.Tables[0].Rows[i]["UserID"]; 

     if (myBoxes[i].Checked) 
     { 
      myconnection.runUpdate("UPDATE Users SET InOperation = 1, OperationOrder = CASE WHEN OperationOrder = 1 THEN 1 ELSE CASE WHEN InOperation=1 THEN OperationOrder ELSE (SELECT COUNT(*)+1 FROM Users WHERE InOperation=1 AND OperationOrder > 0) END END WHERE UserID=" + userID); 
      myconnection.runUpdate("UPDATE Users SET OperationOrder = CASE WHEN OperationOrder = 0 THEN (SELECT COUNT(*) FROM Users WHERE InOperation=1) ELSE OperationOrder END WHERE InOperation=1"); 
     } 
     else 
     { 
      myconnection.runUpdate("UPDATE Users SET InOperation = 0, OperationOrder = 0 WHERE UserID=" + userID); 
      myconnection.runUpdate("UPDATE Users SET OperationOrder = CASE WHEN OperationOrder -1 = 0 THEN (SELECT COUNT(*) FROM Users WHERE InOperation=1) ELSE OperationOrder -1 END WHERE InOperation=1"); 
     } 
    } 
} 
相关问题