Datatable, bindingsource и datagridview
Привет,
Я сделал набор данных и ограничил его (DataSource/BindningSource) в DataGridView.
Отсюда пользователь может ввести (двойные) значения, которые я позже смогу использовать для своих вычислений.
Я добавил кнопку для сохранения и загрузки таблиц. Когда я загружаю/открываю таблицу, значения отображаются в виде-DataGridView, но мне не удается подключить/установить ее к набору данных.
Ниже приведен основной код загрузки/открытия. Здесь без набора данных; data_vault.Доход.
private void Open_Click(object sender, EventArgs e) { //open a table OpenFileDialog open_data = new OpenFileDialog(); open_data.Title = "Open file"; open_data.Filter = "XML Files (*.xml)|*.xml"; if (open_data.ShowDialog() == DialogResult.OK) { //Leser filen StreamReader read_table = new StreamReader(File.OpenRead(open_data.FileName)); //Nye rader i tabellen DataTable dtable = new DataTable(); dtable.Columns.Add(new DataColumn("L2_n", typeof(double))); dtable.Columns.Add(new DataColumn("L1_n", typeof(double))); //Splitter tekstfilen List<string> s_list = new List<string>(); string str = read_table.ReadLine(); char[] spearator = { '.', ' ' }; String[] strlist = str.Split(spearator); foreach (String s in strlist) { s_list.Add(s); } int count = s_list.Count; int i = 0; //Setter inn verdier i tabell for (int j = 0; j < (count - 1) / 2; j++) { DataRow RowValues = dtable.NewRow(); double d = Double.Parse(s_list[i]); RowValues[0] = Double.Parse(s_list[i]); i++; RowValues[1] = Double.Parse(s_list[i]); i++; dtable.Rows.Add(RowValues); } dataGridView1.DataSource = dtable; } }
Позже я буду собирать ценности;
private void button1_Click(object sender, EventArgs e) { //OK button //Liste lengder int i = 0; foreach (var obj in data_vault.Revenue) { double l2_tall = (Double)dataGridView1["l2nDataGridViewTextBoxColumn", i].Value; double l1_tall = (Double)dataGridView1["l1nDataGridViewTextBoxColumn", i].Value; i++; } Line straight_line = Line.CreateBound(l2_tall , l1_tall); }
Что я уже пробовал:
Я попытался добавить, клонировать, создать новый объект и выполнить цикл, чтобы установить значения det. Также
OleDbDataAdapter -> adapter.Update(dtable);
и SQL.но, вероятно, с некоторыми ошибками.
Richard MacCutchan
Почему вы создаете список из данных, а не добавляете его непосредственно в DataTable? И почему имена столбцов, которые вы используете для ссылки на DataGridView, отличаются от имен столбцов в DataTable?
camibo
Привет и спасибо за быстрый повтор.
Может быть, для этого нет веской причины. :С
1. список строк составляется для разбиения текстового файла, предварительно сохранив таблицу. Добавление его обратно в таблицу, которую я могу установить в набор данных (во всяком случае, это была идея).
2. Имена столбцов являются "предварительный просмотр" то же самое.
Richard MacCutchan
1. Все, что нужно, это разделить строку, а затем преобразовать каждое число в двойное и сохранить в новом потоке данных. Список не нужен. Кстати его лучше использовать Double.TryParse
скорее, чем Convert.ToDouble
, так как это будет ловить любые плохие строковые значения.
2. в соответствии с вашим кодом выше имена не совпадают.
camibo
Доброе утро,
Из того, что я могу понять, именно это я и делаю. Теперь у меня есть DataRow с правильными сохраненными значениями. все значения отображаются так, как они должны отображаться.
Однако я не уверен, что понимаю, как обновить datatble, чтобы позже использовать эти значения для дальнейших вычислений. Я думаю, что немного запутался в том, что такое datatable, содержащий значения в datagridview. Как называется здесь datatable, в котором я должен хранить значения DataRow?
Для списка l2_test и l1_test. Они используются только для функции set/get, которую я создал, и не "вмешиваются" в код.
Richard MacCutchan
Если вам нужно изменить какие-либо значения, то вы должны изменить их в DataTable
, так как это является источником для DataGridView
. Если вы измените их в DataGridView
тогда источник и дисплей будут не синхронизированы.
camibo
1. So; dataGridView1.DataSource = dtable;
обновляет вид?
2. Можете ли вы предоставить пример сценария для обновления DataTable?
3. Я не понимаю, как объект DataTable dtable связаны с элементом управления datagridview/источник данных.?
Richard MacCutchan
1. Нет он устанавливает привязку между исходными данными и целевым дисплеем.
2. просто обновляйте любые строки и столбцы по мере необходимости.
3.
dataGridView1.DataSource = dtable; // this is how it is linked
camibo
Если это так, то я не понимаю, почему код не работает так, как он есть?
Я сделал таблицу, которая правильно отображает значения в представлении, но значения не будут сохранены. Смотрите прилагаемое видео.
camibo
Можете ли вы отправить мне адрес электронной почты, чем я могу отправить вам видео, отображающее проблему? :)
Richard MacCutchan
Что вы имеете в виду под этим - но ценности не будут храниться."?
И нет, у вас не может быть моего адреса электронной почты. Вопросы, ответы и комментарии-все это остается здесь, на форумах.
camibo
1. если я введу значения в форму, код будет производить то, что я хочу.
2. Если я загружаю одну и ту же (сохраненную) таблицу. Таблица будет отображаться в форме правильно. Но код ничего не генерирует.
Я сделал видео, показывающее эту проблему, но не вижу, как я могу загрузить его на форум.
Richard MacCutchan
Извините, что ничего не проясняю. Я предлагаю вам открыть новый вопрос и четко показать весь код, на который вы ссылаетесь, и подробно объяснить, какие результаты вы видите или не видите.
Вы не можете загружать видео на эти форумы, чтобы защитить себя от нежелательных материалов.
camibo
Теперь я обновил код.
Если я набираю значения в форме-dataviewgrid, код работает.
Если я загружаю значения в datagridview, они отображаются в форме, но код не создает строку.
Richard MacCutchan
foreach (var obj in data_vault.Revenue) { double l2_tall = (Double)dataGridView1["l2nDataGridViewTextBoxColumn", i].Value; double l1_tall = (Double)dataGridView1["l1nDataGridViewTextBoxColumn", i].Value; i++; }
Таким образом, в конце этого цикла у вас нет нигде сохраненных данных, и две переменные были удалены, поскольку они существуют только внутри цикла.
camibo
Когда я загружаю таблицу, код вообще не запускается внутри цикла foreach.
В data_vault нет данных "var obj.Доход"
Richard MacCutchan
Что такое data_vault и где он создается?
camibo
Data_vault.xsd - это набор данных.
частная Data_vault data_vault; (форма.data_vault)
Richard MacCutchan
Это просто еще одна переменная, которую вы вводите, не имея никакой информации о том, что это на самом деле и где она создается. Ваш код ссылается на объект, который вы нигде не показывали, поэтому мы не можем угадать его назначение или его связь с остальной частью этого вопроса.
camibo
Как я это понял;
- Он создан в виде конструктора.
- Переменная берется из набора данных - Data_vault.xsd
Здесь представлены proparties / наборы от Форма.Дизайнер
// dataGridView1
//
this.dataGridView1.AutoGenerateColumns = false;
это.dataGridView1.ColumnHeadersHeightSizeMode = Система.Окна.Формы.DataGridViewColumnHeadersHeightSizemode.Авторазмер;
this.dataGridView1.Columns.AddRange(новая система.Окна.Формы.DataGridViewColumn[] {
this.l2nDataGridViewTextBoxColumn,
this.l1nDataGridViewTextBoxColumn});
это.dataGridView1.Источник данных = это.revenueBindingSource;
это.dataGridView1.Местоположение = новая система.Рисование.Точка(38, 313);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = новая система.Рисование.Размер(183, 214);
это.dataGridView1.TabIndex = 0;
это.toolTip_tabell.SetToolTip(это.dataGridView1, "Листэ ленгдер мед [м] ре каждый раз, сиден АВ hvelvet. Ее за лето метра я høyden");
this.dataGridView1.CellContentClick += новая система.Окна.Формы.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);
//
// l2nDataGridViewTextBoxColumn
//
это.l2nDataGridViewTextBoxColumn.AutoSizeMode = Система.Окна.Формы.DataGridViewAutoSizeColumnMode.ColumnHeader;
это.l2nDataGridViewTextBoxColumn.DataPropertyName = "L2_n";
это.l2nDataGridViewTextBoxColumn.HeaderText = "L2_n";
это.l2nDataGridViewTextBoxColumn.Имя = "l2n_DataGridViewTextBoxColumn";
это.l2nDataGridViewTextBoxColumn.Ширина = 56;
//
// l1nDataGridViewTextBoxColumn
//
это.l1nDataGridViewTextBoxColumn.AutoSizeMode = Система.Окна.Формы.DataGridViewAutoSizeColumnMode.ColumnHeader;
это.l1nDataGridViewTextBoxColumn.DataPropertyName = "L1_n";
это.l1nDataGridViewTextBoxColumn.HeaderText = "L1_n";
это.l1nDataGridViewTextBoxColumn.Имя = "l1n_DataGridViewTextBoxColumn";
это.l1nDataGridViewTextBoxColumn.Ширина = 56;
//
// revenueBindingSource
//
this.revenueBindingSource.DataMember = "Выручка";
this.revenueBindingSource.Источник данных = это.data_vault;
//
// data_vault
//
это.data_vault.Свойством Datasetname = "Data_vault";
это.data_vault.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
Richard MacCutchan
Таким образом, у вас есть источник привязки между data_vault и DataGridView. Затем при загрузке формы вы считываете некоторые данные из файла в DataTable и привязываете их к своему DataGridView. Я думаю, что вам нужно посмотреть на дизайн вашего приложения и решить, какой источник данных на самом деле содержит информацию, которую вы хотите обработать.