Как собрать значения в массив и передать коллекцию в datagridview в C #? - PullRequest
0 голосов
/ 21 сентября 2019

Я работаю над пользовательским приложением POS в Asp.Net, используя C #, где у меня есть два DataGridViews в форме окна.DataGridView1 показывает все продажи.Когда пользователь щелкает любую запись в DataGridView1, определенные данные, такие как ProductName, Количество, Вариация, UnitPrice и TotalCost из выбранной записи в DataGridView, передаются в DataGridView2.Это делается с помощью события CurrentCellChanged в DataGridView2.

Моя проблема заключается в том, что у меня есть более одной детали, связанной с каждой продажей, которую я пытаюсь показать на DataGridView2, но я не могу установить каждую деталь выбранной продажив качестве источника данных для DataGridView2.Вот код, который я пробовал до сих пор:

private void DataGridView1_CurrentCellChanged(object sender, EventArgs e)
{
    try
    {
        string saleId = DataGridView1.CurrentRow.Cells[0].Value.ToString();
        DataGridView2.DataSource = SalesClass.SelectedSaleDetails(saleId);
    }
    catch (Exception)
    {

    }
}

Здесь событие CurrentCellChanged передает выбранный SaleId в мой SalesClass, где я запрашиваю детали продаж, связанные с этим конкретным SaleId, например:

public static DataTable SelectedSaleDetails(string saleId)
{
    DataTable dt = new DataTable();
    dt = DataAccess.Select(string.Format("select * from vSalesDetails where SaleID = {0}", saleId));
    string[] values;

    foreach (DataRow drItem in dt.Rows)
    {
        string variation = drItem["ProductVariation"].ToString();


        string productName = drItem["ProductName"].ToString();
        decimal quantity = Convert.ToDecimal(drItem["SaleQuantity"]);
        decimal saleCostLevelC = Convert.ToDecimal(drItem["LevelCCost"]);
        decimal purchaseCostLevelC = Convert.ToDecimal(drItem["LevelCPurchaseCost"]);
        decimal levelBStandard = Convert.ToDecimal(drItem["LevelBStandard"]);
        decimal levelCStandard = Convert.ToDecimal(drItem["LevelCStandard"]);

        decimal parentTotalSalesCost = 0;
        decimal levelATotalSalesCost = 0;
        decimal levelBTotalSalesCost = 0;
        decimal levelCTotalSalesCost = 0;
        decimal salecost = 0;
        decimal unitCost = 0;
        switch (variation)
        {
            case "Parent Product":
                decimal soleProductUnitPrice = Convert.ToDecimal(drItem["SoleProductUnitPrice"]);

                salecost = quantity * soleProductUnitPrice;
                unitCost = soleProductUnitPrice;
                break;

            case "Level A":
                decimal levelBSaleCost = levelCStandard * saleCostLevelC;
                decimal levelASaleCost = levelBStandard * levelBSaleCost;

                salecost = quantity * levelASaleCost;
                unitCost = levelASaleCost;
                break;

            case "Level B":
                decimal saleCostLevelB = levelCStandard * saleCostLevelC;
                salecost = quantity * saleCostLevelB;
                unitCost = saleCostLevelB;
                break;

            case "Level C":
                salecost = quantity * saleCostLevelC;
                unitCost = saleCostLevelC;
                break;

            default:
                break;
        }

        values = new string[] {productName, variation, unitCost.ToString(), quantity.ToString(), salecost.ToString()};
    }

//  return each of the productName, variation, unitCost and quantity of a selected Sale here. This is going to be assigned as the DataGridView2 DataSource.
}

Мой код работает нормально, и я могу получить все необходимые значения в массиве values внутри цикла foreach.Однако я почему-то не могу передать детали продажи (productName, изменение, unitCost и количество) конкретной продажи обратно в источник данных DataGridView2 здесь:

DataGridView2.DataSource = //values returned from SalesClass;

Есть ли кто-нибудь, кто может предложить мне еще лучшеэффективный подход к этому, поскольку я новичок здесь.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Вы переназначаете values в качестве последней строки в цикле foreach.Таким образом, при выходе из этого цикла values будет иметь данные только для последней строки в dt.

Почему бы не создать вторую DataTable, перенести данные из dt ввторой DataTable и просто вернуть это?

public static DataTable SelectedSaleDetails(string saleId)
{
    DataTable dt = new DataTable();
    dt = DataAccess.Select(string.Format("select * from vSalesDetails where SaleID = {0}", saleId));

    DataTable result = new DataTable();
    result.Columns.Add("ProductName");
    result.Columns.Add("Variation");
    result.Columns.Add("UnitCost");
    result.Columns.Add("Quantity");
    result.Columns.Add("SaleCost");

    foreach (DataRow drItem in dt.Rows)
    {
       // Massage the data like you're doing...
       // And replace the assignment to values with...

       var row = result.NewRow();
       row["ProductName"] = productName;
       row["Variation"] = variation;
       row["UnitCost"] = unitCost.ToString();
       row["Quanity"] = quantity.ToString();
       row["SaleCost"] = saleCost.ToString();
       result.Add(row);
    }
    return result;
}

В примечании вы, вероятно, захотите узнать об изменении DataAccess.Select для обработки параметризованных запросов.В настоящее время у вас может быть уязвимость SQL-инъекция .

1 голос
/ 21 сентября 2019

Вы смотрели документацию для DataGridView ?Похоже, вам нужно объявить BindingSource вместе с объявлением DataGridView1 и DataGridView2.

private BindingSource bindingSource1 = new BindingSource();

Затем измените код на

string saleId = DataGridView1.CurrentRow.Cells[0].Value.ToString();
bindingSource1.DataSource = SalesClass.SelectedSaleDetails(saleId);   
DataGridView2.DataSource = bindingSource1;

Невернуть тип string[] из SalesClass.SelectedSaleDetails.Вы хотите вернуть свой DataTable dt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...