Добавление колонки с результатом в datagridview
У меня есть текстовый файл, который представляет базу данных, как программно можно создать вычисляемую колонку в которой будет выводиться прибыль товара, как sold*coast?
OleDbConnection StrCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=file;Extended Properties=text");
DataSet AllTables;
public Form3()
{
InitializeComponent();
}
private void Clear_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); //удаление
}
else
{
MessageBox.Show("Выберите строку для удаления.", "Ошибка.");
}
}
private void Form3_Load(object sender, EventArgs e)
{
OleDbConnection StrCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=file;Extended Properties=text");
//Строка для выборки данных
string Select1 = "SELECT * FROM [bd.txt]";
//Создание объекта Command
OleDbCommand comand1 = new OleDbCommand(Select1, StrCon);
//Определяем объект Adapter для взаимодействия с источником данных
OleDbDataAdapter adapter1 = new OleDbDataAdapter(comand1);
//Определяем объект DataSet
DataSet AllTables = new DataSet();
//Открываем подключение
StrCon.Open();
//Заполняем DataSet таблицей из источника данных
adapter1.Fill(AllTables);
//Заполняем обект datagridview для отображения данных на форме
dataGridView1.DataSource = AllTables.Tables[0];
StrCon.Close();
}
private void Exit_Click(object sender, EventArgs e)
{
DialogResult iExit;
iExit = MessageBox.Show("Подтвердите, что Вы хотите выйти", "Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if(iExit == DialogResult.Yes) {Application.Exit();}
}
private void Add_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int n = dataGridView1.SelectedRows[0].Index;
dataGridView1.Rows[n].Cells[0].Value = product.Text; // столбец Name
dataGridView1.Rows[n].Cells[1].Value = department.Text; // Age
dataGridView1.Rows[n].Cells[2].Value = sold.Text; // Programmer
dataGridView1.Rows[n].Cells[3].Value = stock.Text;
dataGridView1.Rows[n].Cells[4].Value = coast.Text;
}
else
{
}
/*AddForm af = new AddForm();
af.Owner = this;
af.Show();*/
}
private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
DialogResult dr = MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (dr == DialogResult.Cancel)
{
e.Cancel = true;
}
}
private void Search_Click(object sender, EventArgs e)
{
SearchForm sf = new SearchForm();
sf.Owner = this;
sf.Show();
}
private void Save_Click(object sender, EventArgs e)
{
try
{
StreamWriter sw = new StreamWriter(@"bd.txt", false, Encoding.Default);
//Добавление имен столбцов
for (int j = 0; j < dataGridView1.ColumnCount; j++)
{
sw.Write(dataGridView1.Columns[j].HeaderText);
if (j < dataGridView1.ColumnCount - 1)
sw.Write(",");
}
sw.WriteLine();
for (int i = 0; i < dataGridView1.RowCount; i++)
{
for (int j = 0; j < dataGridView1.ColumnCount; j++)
{
sw.Write(dataGridView1.Rows[i].Cells[j].Value);
if (j < dataGridView1.ColumnCount - 1)
sw.Write(",");
}
sw.WriteLine();
}
sw.Flush();
sw.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void edit_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int n = dataGridView1.SelectedRows[0].Index;
dataGridView1.Rows[n].Cells[0].Value = product.Text;
dataGridView1.Rows[n].Cells[1].Value = department.Text;
dataGridView1.Rows[n].Cells[2].Value = sold.Text;
dataGridView1.Rows[n].Cells[3].Value = stock.Text;
dataGridView1.Rows[n].Cells[4].Value = coast.Text;
}
else
{
MessageBox.Show("Выберите строку для редактирования.", "Ошибка.");
}
}
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
try
{
product.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
department.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
sold.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
stock.Text = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();
coast.Text = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();
}
catch
{
}
}
}
Ответы (1 шт):
Автор решения: Bulson
→ Ссылка
Создаем класс модели
class Product
{
public string Name { get; set; }
public string Department { get; set; }
public int Sold { get; set; }
public int Stock { get; set; }
public int Cost { get; set; }
public int Profit => Sold * Cost;
}
кстати "стоимость" это Cost, а Coast это "побережье"
Создадим подсобный класс для работы с файлом (я написал только чтение)
class CsvService
{
private readonly string _pathToFile;
public CsvService(string pathToFile)
{
if (string.IsNullOrEmpty(pathToFile))
{
throw new ArgumentNullException(nameof(pathToFile));
}
_pathToFile = pathToFile;
}
public IEnumerable<Product> ReadProductsFile()
{
if (File.Exists(_pathToFile) == false)
{
Debug.WriteLine($"Файл {_pathToFile} не найден");
throw new Exception();
}
var result = new List<Product>();
try
{
var lines = File.ReadAllLines(_pathToFile)
.Skip(1)
.Where(l => !string.IsNullOrEmpty(l))
.Select(l => l.Split(','));
foreach (var line in lines)
{
var p = new Product
{
Name = line[0],
Department = line[1],
Sold = int.TryParse(line[2], out int sold) ? sold : 0,
Stock = int.TryParse(line[3], out int stock) ? stock : 0,
Cost = int.TryParse(line[4], out int cost) ? cost : 0,
};
result.Add(p);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return result;
}
}
Читаем такой файл
Products,Department,Sold,Stock,Cost
Apple,Fruits,25,300,3
Meat,Gastronomia,60,100,10
Banana,Fruits,40,60,4
Код в форме такой
public partial class FormMain : Form
{
//источник данных для DGV
private BindingSource _bsProducts;
public FormMain()
{
InitializeComponent();
this.Load += FormMain_Load;
_buttonLoad.Click += ButtonLoad_Click;
_buttonMaxProfit.Click += ButtonMaxProfit_Click;
}
private void FormMain_Load(object sender, EventArgs e)
{
//привязkа к DGV
_bsProducts = new BindingSource();
_dataGridView.DataSource = _bsProducts;
}
private void ButtonLoad_Click(object sender, EventArgs e)
{
//создаем сервис чтения данных из файла
var service = new CsvService("bd.txt");
//читаем и заполняем источник данных для DGV
service.ReadProductsFile()
.ToList()
.ForEach(p => _bsProducts.Add(p));
}
private void ButtonMaxProfit_Click(object sender, EventArgs e)
{
if (_bsProducts.Count == 0) return;
var product = _bsProducts.List.OfType<Product>()
.OrderByDescending(p => p.Profit)
.First();
_textBoxOutput.Text = $"{product.Name}: {product.Profit.ToString("c2")}";
}
}
