camibo Ответов: 0

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. Я думаю, что вам нужно посмотреть на дизайн вашего приложения и решить, какой источник данных на самом деле содержит информацию, которую вы хотите обработать.

0 Ответов