1

正常に機能するデータベースからのデータとのdatagridviewバインディングがあります。フォームが読み込まれると、データが読み込まれます。クライアントの要件に従って、次のコードを使用してデータグリッドビューに新しいボタン列を追加しました

private void form1_load
{
           var productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
        {
            productid = a.Key,
            prouctnam = a.FirstOrDefault().product_Name,
            productimage = a.FirstOrDefault().product_Image,
            productdescr = a.FirstOrDefault().product_Description,
            stockavailable = a.LongCount(),
            productprice = a.FirstOrDefault().product_Price
        });

        productbindingsource.DataSource = productsbycount;
        productgridview.DataSource = productbindingsource;
        DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
        productgridview.Columns.Add(buttoncolumn);
        buttoncolumn.Text = "Buy";
        buttoncolumn.HeaderText = "Buy";
        buttoncolumn.UseColumnTextForButtonValue = true;
        buttoncolumn.Name = "btnbuy";
        productgridview.Columns[0].Visible = false;

}

フォームが正常に機能するようにロードされたとき。

しかし、リストビューのようなものでアイテムのいずれかを選択した場合のような条件をチェックしています。データグリッドビューは、選択したアイテムに従って並べ替えられます...そのために私はこのように行いました...。

if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
    var productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
      {
          productid = a.Key,
          prouctnam = a.FirstOrDefault().product_Name,
          productimage = a.FirstOrDefault().product_Image,
          productdescr = a.FirstOrDefault().product_Description,
          stockavailable = a.LongCount(),
          productprice = a.FirstOrDefault().product_Price
       });

       productbindingsource.DataSource = productsbycount;
       productgridview.DataSource = productbindingsource;
       DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
       productgridview.Columns.Add(buttoncolumn);
       buttoncolumn.Text = "Buy";
       buttoncolumn.HeaderText = "Buy";
       buttoncolumn.UseColumnTextForButtonValue = true;
       buttoncolumn.Name = "btnbuy";
       productgridview.Columns[0].Visible = false;
}
  • リストビューの最初のアイテム(「すべて」)をクリックすると、データグリッドビューは正常に機能しています...。
  • リストビューの最初のアイテム(「すべて」)をもう一度クリックすると、ボタンの列が2回表示されます...。
  • リストビューの最初のアイテム(「すべて」)をもう一度クリックすると、ボタンの列が3回表示されます...

これは、リストビューのすべてのアイテムで発生していることです。

私の質問は、データグリッドビューにボタン列を追加する他の方法はありますか?

form1.cs [design]にボタン列を追加しようとしましたが、これはdatagridviewの実際の列に影響します。私はC#言語のWinFormで作業しています。誰かがこれらについて何かアイデアを提案できますか?

このループで以下のコードを削除するとします

if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
}

実際のボタンの列が消えました。誰かがこれを手伝ってくれませんか。

変更されたコード:

最初の条件:if(lstviewcategories.SelectedItems [0] .Text.ToString()== CategoryType.Type2){

                 var productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                             });
                 productbindingsource.ResetBindings(false);
                 /*productbindingsource.DataSource = productsbycount;
                 productgridview.DataSource = productbindingsource;
                 DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
                 productgridview.Columns.Add(buttoncolumn);
                 buttoncolumn.Text = "Buy";
                 buttoncolumn.HeaderText = "Buy";
                 buttoncolumn.UseColumnTextForButtonValue = true;
                 buttoncolumn.Name = "btnbuy";
                 productgridview.Columns[0].Visible = false;*/


             }

2番目の条件:

           if (lstviewcategories.SelectedItems[0].Text.ToString() == CategoryType.Type3)
             {
                 var productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 500 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                              });
                 productbindingsource.ResetBindings(false);
              /* productbindingsource.DataSource = productsbycount;
                 productgridview.DataSource = productbindingsource;
                 DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
                 productgridview.Columns.Add(buttoncolumn);
                 buttoncolumn.Text = "Buy";
                 buttoncolumn.HeaderText = "Buy";
                 buttoncolumn.UseColumnTextForButtonValue = true;
                 buttoncolumn.Name = "btnbuy";
                 productgridview.Columns[0].Visible = false;*/

             }

これらの牽引条件は機能していません..

4

2 に答える 2

2

まず、DRY 原則について読むことを強くお勧めします。あなたの質問に答えるにはBindingSource、データ構造を変更せずにデータグリッドビューのデータを更新できるように、あなたの更新方法を使用することをお勧めします。次のすべてをロード時に 1 回だけ実行してから、実際にデータ型を変更したい場合を除き、別の場所でデータを更新する必要があります。たとえば、データが別のソースから取得されている場合などです。

productbindingsource.DataSource = productsbycount;
        productgridview.DataSource = productbindingsource;
        DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
        productgridview.Columns.Add(buttoncolumn);
        buttoncolumn.Text = "Buy";
        buttoncolumn.HeaderText = "Buy";
        buttoncolumn.UseColumnTextForButtonValue = true;
        buttoncolumn.Name = "btnbuy";
        productgridview.Columns[0].Visible = false;

次のコード ブロックでこれをすべてやり直す代わりに、単にproductbindingsource.ResetBindings(false);を呼び出します。

if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
            {
            }

更新:また、このコード ブロックで var productsbycount を定義する代わりに、一番上にあるクラス変数にして、すべてのメソッドにアクセスできるようにします。データを更新すると、以前の var productsbycount が上書きされ、それが素晴らしい働きをします。

更新 2: 'ResetBindings() は、データを変更した後はいつでも使用できますが、既に述べたように、クラス レベルの変数 (別名、var productsbycount をクラスの先頭に置く) が必要であり、この例では次のようになります。この後;

productprice = a.FirstOrDefault().product_Price
           });

更新 3:繰り返しますが、コード全体を記述しないようにアドバイスを提供するためにここにいますが、気分が良いので =) 繰り返しますが、ここにはかなりの重複があるようであり、コードベースが成長するにつれて、これが原因である可能性がありますあなたはとても痛いです!;

namespace Test
{
    public partial class Form2 : Form
    {
        BindingSource productbindingsource;
        var productsbycount;

        public Form2()
        {
            InitializeComponent();
            Load += new EventHandler(Form2_Load);
        }

        void Form2_Load(object sender, EventArgs e)
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
            {
                productid = a.Key,
                prouctnam = a.FirstOrDefault().product_Name,
                productimage = a.FirstOrDefault().product_Image,
                productdescr = a.FirstOrDefault().product_Description,
                stockavailable = a.LongCount(),
                productprice = a.FirstOrDefault().product_Price
            });
            productbindingsource.DataSource = productsbycount;
            productgridview.DataSource = productbindingsource;
            DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
            productgridview.Columns.Add(buttoncolumn);
            buttoncolumn.Text = "Buy";
            buttoncolumn.HeaderText = "Buy";
            buttoncolumn.UseColumnTextForButtonValue = true;
            buttoncolumn.Name = "btnbuy";
            productgridview.Columns[0].Visible = false;
        }

        private void methodNameHere()
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                              });

            productbindingsource.ResetBindings(false);
        }
    }
}
于 2011-08-25T13:20:02.157 に答える
0

あなたのサポートに感謝します、私は私の問題を解決しました.... .

if (lstviewcategories.SelectedItems[0].Text.ToString() == CategoryType.Type2)

以下のように割り当てました....

productgridview.datasource = productsbycount.Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)  

幸いなことに、それは正常に機能していました.......

于 2011-09-17T15:31:32.110 に答える