Как сохранить источник данных в списке <string>(без sqlconnection и т. Д.) - PullRequest
0 голосов
/ 22 февраля 2019

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

У меня есть несколько datatables с 2 столбцами в каждом datatable.Одним из них является столбец bool (значения флажков).Значения флажка пусты, когда форма загружается, так что пользователь может проверить или снять их.После обновления флажка пользователь нажимает button1, чтобы сохранить только значения флажка в dataset, и этот dataset будет сохранен в списке.

Эти таблицы данных будут затем очищаться, и те же шаги будут повторяться в течение неизвестного числа раз (форма загружает пустые таблицы данных, флажки обновления пользователя, пользователь нажимает кнопку1).Я использовал метод ниже.Нет ошибок, но когда я хочу отобразить значение списка в datagridview1 в Form2, оно было пустым.Ниже мой код.Надеюсь получить помощь, спасибо!

Класс 1.cs (где я начал свой список)

public static List<string> list = new List<string>();

Form1.cs

//Create dataset
private DataSet Getdataset()
    {
        DataSet ds = new DataSet();

        DataTable dt1 = new DataTable();
        dt1.Columns.Add("Items", typeof(string));
        dt1.Columns.Add("Status", typeof(bool));
        dt1.Rows.Add("hello");
        dt1.Rows.Add("hello");
        ds.Tables.Add(dt1);
        dgv1.DataSource = dt1;
        dgv1.AllowUserToAddRows = false;

        DataTable dt2 = new DataTable();
        dt2.Columns.Add("Items", typeof(string));
        dt2.Columns.Add("Status", typeof(bool));
        dt2.Rows.Add("bye");
        dt2.Rows.Add("bye");
        ds.Tables.Add(dt2);
        dgv2.DataSource = dt2;
        dgv2.AllowUserToAddRows = false;

        return ds;
    }

//Save dataset in a List
private void button1_Click(object sender, EventArgs e)
    {
        DataSet dd = Getdataset();
        foreach (DataTable table in dd.Tables)
        {
            foreach (DataRow row in table.Rows)
            {
                Class1.list.Add(Convert.ToString(row["Status"]));
            }
        }

        Form2 f = new Form2();
        f.ShowDialog();
    }

Form2.cs

//Display dataset in datagridview
private void compile_VisibleChanged(object sender, EventArgs e)
    {
        DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
        foreach (string item in Class1.list)
        {
            row.Cells[0].Value = item;
        }
        dataGridView1.Rows.Add(row);
    }

EDIT Согласно комментарию er-sho, я добавил окно сообщения в коде ниже, и онопоказал Systems.Collection.Generic.List1[System.String] 7 раз (у меня 6 флажков).В datagridview1 все еще не было дисплея, и я инициализировал no.столбцов, заголовки для datagridview1, чтобы избежать ошибки компиляции.Тем не менее, см. Ниже комментарий под решением Гохама (кажется, что данные в Списке не соответствуют ожидаемым)

foreach (string item in Class1.list)
{
 MessageBox.Show(Class1.list.ToString());
 row.Cells[0].Value = item;
}      

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Ваш метод Getdataset () не заполняет столбец Status таблицы.Попробуйте

private DataSet Getdataset()
{
    DataSet ds = new DataSet();

    DataTable dt1 = new DataTable();
    dt1.Columns.Add("Items", typeof(string));
    dt1.Columns.Add("Status", typeof(bool));
    DataRow dr = dt1.NewRow();
    dr["Items"] = "Hello";
    dr["Status"] = checkBox1.Checked;
    dt1.Rows.Add(dr);
    ds.Tables.Add(dt1);
    dgv1.DataSource = dt1;
    dgv1.AllowUserToAddRows = false;
    ...
    return ds;
}

Я рекомендую вам использовать BindingList вместо List и назначить список в качестве источника данных для dataGridView1.

public static BindingList<string> list = new BindingList<string>();

Форма 2

private void compile_VisibleChanged(object sender, EventArgs e)
{
    dataGridView1.DataSource = Class1.list;
}

Я думаюиспользование обработчика событий FormLoad вместо VisibleChanged должно быть лучше в вашем случае.

Посмотрите: Список привязок к DataGridView в WinForm

0 голосов
/ 22 февраля 2019

Каждый раз, когда вы нажимаете button1, вы перезаписываете свои данные в dgv1 со значениями по умолчанию:

DataTable dt1 = new DataTable();
dt1.Rows.Add("hello");
dt1.Rows.Add("hello");
dgv1.DataSource = dt1;

dt1 будет содержать строки только со значениями Item , но не с Статус .Вы должны добавить код с получением пользовательских данных

ОБНОВЛЕНИЕ Для достижения цели необходимо выполнить следующие шаги:

  1. Init dgv1 - добавить столбцы и заполнитьстроки со значениями по умолчанию

    private void Form1_Load(object sender, EventArgs e)
    {
        UpdateDgv1();
    }
    
    private void UpdateDgv1()
    {
        DataSet ds = new DataSet();
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("Items", typeof(string));
        dt1.Columns.Add("Status", typeof(bool));
        dt1.Rows.Add("hello");
        dt1.Rows.Add("hello");
        ds.Tables.Add(dt1);
        dgv1.DataSource = dt1;
        dgv1.AllowUserToAddRows = false;
    }
    
  2. Получить значения из dgv1 при нажатии кнопки

    private void button1_Click(object sender, EventArgs e)
    {
        for (var i = 0; i < dgv1.Rows.Count; i++)
        {
            list.Add(Convert.ToString(dgv1.Rows[i].Cells[1].Value));
        }
    
        //restore dgv1
        UpdateDgv1();
    
        Form2 f = new Form2();
        f.ShowDialog();
    
        //clear list with old values or comment it
        //if you want to save history of user inputs
        list.Clear();
    }
    
  3. Показать содержимое списка в datagridview1 формы 2

    private void Form2_VisibleChanged(object sender, EventArgs e)
    {
        dataGridView1.ColumnCount = 1;
        foreach (string item in Form1.list)
        {
            var newRow = dataGridView1.Rows.Add();
    
            //if checkbox from Form1 not checked
            if (item == string.Empty)
                dataGridView1.Rows[newRow].Cells[0].Value = false.ToString();
            else
                dataGridView1.Rows[newRow].Cells[0].Value = item;
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...