1

データベースにあるすべての従業員に対して同じ設計を繰り返したいと考えています。出席簿のようなものです。従業員の写真、その横にある従業員の名前、プロジェクトの名前を含むドロップダウン メニュー、2 つのボタン (存在するか存在しないか) のようにします。

そして、これまでの私のコードは次のとおりです。

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  _connection.Open();
  OdbcCommand getempos = new OdbcCommand("SELECT ID, filepth from empos ", _connection);
  OdbcDataReader loopempos = getempos.ExecuteReader();

  while (loopempos.Read())
  {
    OdbcCommand findempros = new OdbcCommand("SELECT p.projName from projects p INNER JOIN assigns a ON p.projID = a.projname WHERE a.employeeID LIKE '" + loopempos["ID"].ToString() + "'", _connection);
    OdbcDataReader readit = findempros.ExecuteReader();

    while (readit.Read())
    {
      DropDownList mydblist = (DropDownList)e.Item.FindControl("DropDownList1");
      mydblist.Items.Add(readit["projName"].ToString());
    }

  }
  _connection.Close();
}

ここでの問題は、従業員が割り当てられたプロジェクトがドロップダウン メニューに表示されないことです。第二に、ボタンを区別できません。つまり、ユーザーが在席または不在ボタンをクリックすると、これらのボタンがどの従業員を指しているのかわかりません。これが私がやりたいことをするための最良の方法であるかどうかはよくわかりません。他の考えをいただければ幸いです。

すべての従業員に同じパターンを繰り返す必要があるため、リピーターを使用しています。ここではリピーターが最適なオプションであると考えています。

4

1 に答える 1

1

あなたはほとんど正しい軌道に乗っていると思います。リピーターには、表示する各従業員のレコードを含むクエリが入力されていると想定しています。

そこには、いくつかの問題があります。

  1. ボタン。バインド中に「CommandArgument」をレコードの一意のキー (データベース ID など) に設定します。' /> を使用するだけです

  2. プロジェクト リストの場合、リピーターの ItemDataBound イベント内のすべての従業員レコードをループしているように見えますが、これはおそらくあなたが望むものではありません。リピーターは、特定のデータ セット内の各レコードに対して固定ビットのマークアップを生成します。各リピーター アイテムが作成されると、ItemCreated イベントが発生します。各従業員に対して 1 つの RepeaterItem が、リピーター自体をバインドしているデータ セットであると仮定します。最初にデータをバインドする方法がわからないため、以下のコードで e.Item.DataItem を取得する行を変更する必要がある場合があります。また、私が data.ID を持っている部分は、最初にリピーターをどのように設定しているかに大きく依存します。これは、正しい軌道に乗ることを目的としていました。

  3. また、データ構造をどの程度制御できるかはわかりませんが、これらのレコードの一意のキーで WHERE 条件で LIKE 比較を使用する必要がある場合は、可能であればその構造を再評価する必要があります。SQL の WHERE 条件で LIKE や UPPER/LOWER などを使用すると、インデックスの使用が妨げられ、このクエリの実行が遅くなる可能性があります。

  4. 最後に、指摘しておくと、少なくとも Try-Finally ブロックを使用して、データベース接続が確実に閉じられるようにする必要があります。

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        _connection.Open();
        try
        {
            DataItemTypeName data = (DataItemTypeName)e.Item.DataItem;
            if (data == null)
                // This is more of a debugging check, since I'm a little in the dark about data types and such here.
                throw new Exception("No data.");
    
            OdbcCommand findempros = new OdbcCommand("SELECT p.projName from projects p INNER JOIN assigns a ON p.projID = a.projname WHERE a.employeeID LIKE '" + data.ID + "'", _connection);
            OdbcDataReader readit = findempros.ExecuteReader();
    
            while (readit.Read())
            {
                DropDownList mydblist = (DropDownList)e.Item.FindControl("DropDownList1");
                mydblist.Items.Add(readit["projName"].ToString());
            }
        }
        finally
        { _connection.Close(); }
    }
    
于 2013-08-08T22:05:12.660 に答える