добавление столбца кнопок в представление datagrid вызывает проблемы

У меня есть привязка 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;
}
  • если я нажму на первый элемент списка («Все»), представление сетки данных работает нормально....
  • если я снова нажму на первый элемент списка («Все»), столбец кнопок появится два раза ....
  • если я снова нажму на первый элемент списка ("Все"), столбец кнопок появится три раза...

Это то, что происходит со всеми элементами списка.

Мой вопрос: есть ли другой способ добавить столбец кнопок в представление сетки данных?

Я попытался добавить столбец кнопок в form1.cs[design], это повлияет на фактические столбцы в представлении datagridview. Я работаю в winforms с языком С#. Может ли кто-нибудь предложить какую-либо идею об этом?

Предположим, если я удалю приведенный ниже код в этом цикле

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

Фактический столбец кнопок исчез. Кто-нибудь, пожалуйста, помогите в этом.

ИЗМЕНЕННЫЙ КОД:

ПЕРВОЕ УСЛОВИЕ: если (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;*/


             }

Второе условие:

           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;*/

             }

эти условия буксировки не работают..


person Enigma State    schedule 25.08.2011    source источник
comment
ты только что скопировал код еще раз? кажется так - вы добавляете еще один столбец кнопок в свой код выше...   -  person Random Dev    schedule 25.08.2011
comment
у меня есть проблема с колонкой кнопок ......   -  person Enigma State    schedule 25.08.2011
comment
@ckoenig, пожалуйста, решите мою проблему....   -  person Enigma State    schedule 25.08.2011
comment
Мы здесь, чтобы помочь и дать совет, а не писать весь код за вас =)   -  person Coops    schedule 25.08.2011
comment
В CodeBlend есть смысл - я думаю, что мы сейчас работаем над некоторыми вопросами... насколько я могу судить, приведенный ниже ответ - это то, что вам нужно. Я действительно пытаюсь помочь, но, может быть, вам стоит попытаться немного глубже вникнуть в тему. Насколько я понимаю, вы будете продавать этот код какому-то клиенту, и я не думаю, что этот ваш Spaghetticode/смесь и StackOverflows поможет вам в долгосрочной перспективе.   -  person Random Dev    schedule 25.08.2011


Ответы (2)


Во-первых, я настоятельно рекомендую прочитать о принципе DRY. Чтобы ответить на ваш вопрос, я бы рекомендовал использовать метод обновления вашего BindingSource, чтобы вы могли обновлять данные в своем представлении данных без изменения структуры данных. Вы должны сделать все следующее только один раз при загрузке, а затем обновить данные где-нибудь еще, если вы действительно не хотите изменить тип данных, например. данные поступают из другого источника;

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 в этом блоке кода, сделайте его переменной класса в самом верху, чтобы вы могли получить доступ ко всем своим методам, таким образом, когда вы обновите данные, которые у вас будут перезаписал предыдущую переменную 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);
        }
    }
}
person Coops    schedule 25.08.2011
comment
Пожалуйста, перефразируйте/расширьте вопрос, я не уверен, что вы имеете в виду - person Coops; 25.08.2011
comment
Это помогло вам с вашей проблемой, вы можете следить за этим? - person Coops; 25.08.2011
comment
Вы поместили ResetBindings() в нужное место, но для того, чтобы он работал правильно, вам нужно переместить создание вашей переменной в верхнюю часть вашего класса (чтобы все методы могли получить к ней доступ), а затем просто установите ее в своем операторе if БЕЗ var, как следующим образом: productsbycount = tgs.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price › 500 && a.FirstOrDefault().product_Price ‹= 1000) - person Coops; 25.08.2011
comment
@user899271 давайте продолжим это обсуждение в чате - person Coops; 26.08.2011
comment
Взглянув еще раз на код, который вы разместили здесь, он выглядит как ужасно много дублирования, и это сбивает вас с толку, поскольку ваша кодовая база растет, особенно если вы хотите изменить функциональность, и вам нужно вернуться и вручную обновить все места, которые вы продублировали. код! - person Coops; 26.08.2011
comment
в любом случае это вообще не работает..... и как объявить var productbycount в форме вверху.... - person Enigma State; 30.08.2011

Большое спасибо за вашу поддержку, я решил свою проблему ... вот так ... При загрузке формы я добавил столбец кнопок в представление сетки данных ... и когда я проверяю условия, подобные этому ниже. .

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

Я только что назначил, как показано ниже....

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

К счастью, он работал нормально .......

person Enigma State    schedule 17.09.2011