0

データベースから選択した列データを別のラベルで表示するのを手伝ってください。

protected void Page_Load(object sender, EventArgs e)
{
    con.Open();       
        MySqlCommand countcmd = new MySqlCommand("select count(*) from category", con);
        int temp = Convert.ToInt32(countcmd.ExecuteScalar().ToString());
        MySqlCommand inscmd = new MySqlCommand("select catname from category where cid > 0", con);
        string temp1 = inscmd.ExecuteScalar().ToString();
        MySqlDataReader dr = inscmd.ExecuteReader();
        dr.Read();
        for (int i = 0; i < temp; i++){
            ("label" & i).text = dr[i].ToString();
        }       
}
4

2 に答える 2

0

(string).Text を使用してコントロールにアクセスすることはできません。

次の問題は、これらのラベルを作成しているのは何ですか? 設計時に事前に作成されている場合、十分にあることをどのように確認しますか? 余分なラベルをどうするつもりですか?

PS クエリごとに新しい接続をノックアップし、まれな状況を除いて、インスタンス化された 1 つのラウンドを渡す代わりに、接続プールでキャッシュを処理できるようにする必要があります。

また、クエリ オブジェクトを破棄する必要があります。これには、メモリが不足し始めたときに GC に頼って整理するのではなく、 を使用するのが適しています。

また、クエリは 1 列の行を返すため、while ループが必要です。

IEnumerable<String>最初に行うことは、クエリからを返すことです。

たとえば、次のようなもの

private IEnumerable<String> GetCategoryNames(String argConnectionString)
{
   using(SqlConnection con = new SqlConnection(argConnnectionString))
   {
       con.Open()
       using(SqlCommand com = new SqlCommand("Select CatName From Category Where cid > 0", con))
       {
           using(SqlDataReader reader = com.ExecuteReader())
           {
              while (reader.Read())
              {
                  yield reader[0].ToString();
              }
           }
       }
   }
}

次に、スクロールしてラベルをインスタンス化できるものを次のようなものでノックアップします

private void AddNewLabels(argConnectionString)
{
  int count = 0;
  Point startPoint = new Point(0,0) // assuming this is where you want the first label to be in the scroll box
  labelSpacing = 20; // how far apart vertically should your column of labels be.
  foreach(String labelText in GetCatgoryNames(argConectionString))
  {
      Label label = new Label();
      label.parent = myScrollBox;
      label.Left = StartPoint.X;
      label.Top = Count * LabelSpacing + StartPoint.Y;
      label.Name = String.Concat'MyDynamicLabel'
      // etc
      label.Text = labelText;
      count++;
  }
}

protected void Page_Load(object sender, EventArgs e)
{
   DestroyPreviousLabels();
   AddNewLabels(conn.ConnectionString);
}

DestroyNewLabels はFindControl、「MyDynamicLabel」で始まる名前の FindControls に , を使用します。または、もう少し賢くなり、必要のないものだけを破壊し、必要な場合にのみ作成することもできます。それを行いたい場合は、aList<Label>を検討し、そこから追加および削除すると、ループのカウントが得られます。パフォーマンスが賢明ではないため、それらを見つけ続ける必要はありません。

とにかくいくつかのアイデアと、機能するようになったらリファクタリングの機会もあります。

NB、これは私の頭のてっぺんから外れていたので、ばかげているかもしれません。

于 2013-08-09T14:36:37.707 に答える