добавление столбца кнопки в представление таблицы данных, вызывающее проблемы - PullRequest
1 голос
/ 25 августа 2011

У меня есть привязка 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 с языка C #.Может ли кто-нибудь предложить какие-либо идеи по этому поводу?

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

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

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

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

ПЕРВОЕ СОСТОЯНИЕ: if (lstviewcategories.SelectedItems [0] .Text.ToString () == CategoryType.Тип2) {

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

             }

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Во-первых, я настоятельно рекомендую прочитать по принципу СУХОЙ.Чтобы ответить на ваш вопрос, я бы порекомендовал использовать метод обновления вашего 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")
            {
            }

UPDATE: Кроме того, вместо определения var productsbycount в этом блоке кода, сделайте его переменной класса в самом верхутак что вы можете получить к нему доступ всеми вашими методами. Таким образом, когда вы обновляете данные, вы перезаписываете предыдущий var products bycount, и он будет работать превосходно.

UPDATE2: 'ResetBindings () можетиспользоваться в любой момент после того, как вы изменили данные, но, как я уже сказал, вам нужна переменная уровня класса (AKA помещает 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);
        }
    }
}
0 голосов
/ 17 сентября 2011

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

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

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

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

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

...