1

データベースからデータを取得するこのコードがありますが、私の問題は、ListViewItem. コードは次のとおりです。

    private void patientLvw_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {

        cmd = new OleDbCommand("SELECT * FROM PATIENTS ORDER BY PATIENTS.PatientNo;", conn);


        reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            String patientNo = ""; ;
            String lastName = "";
            String firstName = "";
            String middleInitial = "";
            String age = "";
            String address = "";
            String type = "";
            String status = "";
            if (!reader.IsDBNull(0))
            {
                patientNo = reader.GetInt32(0).ToString();
            }

            if (!reader.IsDBNull(1))
            {
                lastName = reader.GetString(1);
            }

            if (!reader.IsDBNull(2))
            {
                firstName = reader.GetString(2);
            }
            if (!reader.IsDBNull(3))
            {
                middleInitial = reader.GetString(3);
            }
            if (!reader.IsDBNull(4))
            {
                age = reader.GetInt32(4).ToString();
            }
            if (!reader.IsDBNull(5))
            {
                address = reader.GetString(5);
            }
            if (!reader.IsDBNull(6))
            {
                type = reader.GetString(6);
            }
            if (!reader.IsDBNull(7))
            {
                status = reader.GetBoolean(7).ToString();
            }

            ListViewItem lvi = new ListViewItem(patientNo);


            e.Item.SubItems.Add(lastName);

            e.Item.SubItems.Add(firstName);
            e.Item.SubItems.Add(middleInitial + ".");
            e.Item.SubItems.Add(age);
            e.Item.SubItems.Add(address + ".");
            e.Item.SubItems.Add(type);
            e.Item.SubItems.Add(status);

            e.Item = lvi;

        }
    }
4

1 に答える 1

0

RetreiveVirtualItem はアイテムごとに呼び出され、呼び出されるたびにすべての患者をループしています。毎回 e.Item を上書きするので、各項目は最後の値のセットになります。

e.ItemIndexその特定の行のデータのみを確認して取得する必要があります。

または、実際には仮想モードを使用したくない場合は、起動時にクエリを 1 回実行し、手動ですべてをリストに追加する必要があります。

質問が編集される前の回答:

また、なぜ 2 つの ListViewItems を作成しているのですか? あなたのコードはこれであるべきだと思います:

e.Item = new ListViewItem(patientNo);    

if (status.Equals("Yes"))
{
    e.Item.ForeColor = Color.Red;
}

e.Item.SubItems.Add(lastName);

e.Item.SubItems.Add(firstName);
e.Item.SubItems.Add(middleInitial + ".");
e.Item.SubItems.Add(age));
e.Item.SubItems.Add(address + ".");
e.Item.SubItems.Add(type);
e.Item.SubItems.Add(status);   
于 2012-07-19T02:13:45.307 に答える