0

フォームを設定するループがあります。これは、次のコードです(フォームのロードイベント内)。これにより、個人名のチェックボックスが表示されます。ビットフィールドが1の場合、チェックボックスをオンにします。

int xAxisCheckbox = 130;
int yAxisCheckbox = 30;

for (int i = 0; i < selectDS.Tables[0].Rows.Count; i++)
{
    this.myCheckBox = new CheckBox();
    myCheckBox.Location = new Point(xAxisCheckbox, yAxisCheckbox);
    myCheckBox.Size = new Size(120, 20);
    myCheckBox.Text = selectDS.Tables[0].Rows[i]["FullName"].ToString();
    myCheckBox.Checked = (bool)selectDS.Tables[0].Rows[i]["InOperation"];
    yAxisCheckbox = yAxisCheckbox + 80;
}

コードの後半(保存ボタンクリックイベントの場合)では、同じ選択が実行されますが、ティックに応じてInOperationフィールドがtrue/falseに設定される更新のロードも実行されます。また、オペレーションに追加されている場合は、OperationOrderをリセットします。

for (int i = 0; i < selectDataSet.Tables[0].Rows.Count; i++)
{
     userID = (int)selectDataSet.Tables[0].Rows[i]["UserID"];
     if (myCheckBox.Checked)
     {
         connection.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);
         connection.runUpdate("UPDATE Users SET OperationOrder = CASE WHEN OperationOrder = 0 THEN (SELECT COUNT(*) FROM Users WHERE InOperation=1) ELSE OperationOrder END WHERE InOperation=1");
      }
      else
      {
          connection.runUpdate("UPDATE Users SET InOperation = 0, OperationOrder = 0 WHERE UserID=" + userID);
          connection.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");
       }
   }

これに伴う問題は、最後に作成されたオブジェクトに基づいてすべての行を更新することです(たとえば、5行の場合、下のチェックボックスのみがSQLの実行にカウントされ、それらすべてに適用されます)。すべての行を更新するにはどうすればよいですか?最後に作成したオブジェクトだけでなく、作成した各オブジェクトを参照する方法はありますか?

更新:エラーの原因となっている新しいコードの一部を次に示します。public部分クラスSelectUsers:Form {public int userID; public List myBoxes;

    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;

        myBoxes = new List<CheckBox>();

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            this.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;
            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");
            }
        }
    }
4

3 に答える 3

1

個々のチェックボックスではなく、チェックボックスの配列を保持する必要があります

int xAxisCheckbox = 130;
int yAxisCheckbox = 30;

List<CheckBox> myBoxes = new List<CheckBox>();

for (int i = 0; i < selectDS.Tables[0].Rows.Count; i++)
{
    this.myCheckBox = new CheckBox();
    myCheckBox.Location = new Point(xAxisCheckbox, yAxisCheckbox);
    myCheckBox.Size = new Size(120, 20);
    myCheckBox.Text = selectDS.Tables[0].Rows[i]["FullName"].ToString();
    myCheckBox.Checked = (bool)selectDS.Tables[0].Rows[i]["InOperation"];
    yAxisCheckbox = yAxisCheckbox + 80;
    myBoxes.Add(myCheckBox);
}

そして後であなたのforループをir:

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

それはそれをする必要があります。

言うまでもなく、フォームでSQLステートメントを直接実行することはお勧めできませんが、それは別の話です。

于 2013-02-07T20:31:41.090 に答える
0

フォームのすべてのチェックボックスをループし、そこからSQL更新スクリプトを作成し、最後にそのスクリプトの.runUpdate()を実行できれば、はるかに高速になりませんか?

頭に浮かぶこと:

  • 必ずstringBuilderを使用してください
  • 最初の部分は、InOperationフィールドのみを更新します
  • 次に、1つの単一のUPDATEでOperationOrderを更新します

チェックボックスを関連するUserIdとコース外でリンクする方法が必要になります。

于 2013-02-07T20:37:03.350 に答える
-1

Carlos Grappaの答えは、配列を使用すると言って私を正しい方向に向けていましたが、設定が間違っていました。プログラミングの本を読んだ後、次のように配列を作成していることがわかりました。

// 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");
        }
    }
}

デロビーあなたはおそらく正しいです、しかし私はこれをする方法を知りません。

于 2013-03-22T17:12:34.077 に答える