C # доступ к базе данных, созданной во время выполнения из любого другого места - PullRequest
1 голос
/ 20 марта 2019

Итак, у меня есть следующий код:

public partial class Buttons : Form
{
    private DataSet AllEventData = new DataSet("AllEventData");
    private DataTable makeButtonsTable()
    {
        DataTable buttonData = AllEventData.Tables.Add("ButtonData");
        DataColumn column1, column2, column3;

        column1 = new DataColumn();
        column1.DataType = Type.GetType("System.Int32");
        column1.ColumnName = "ID";
        column1.AutoIncrement = true;
        column1.AutoIncrementSeed = 1;
        column1.AutoIncrementStep = 1;

        buttonData.Columns.Add(column1);

        column2 = new DataColumn("Button Name", typeof(String));
        buttonData.Columns.Add(column2);

        column3 = new DataColumn("Button Location", typeof(Rectangle));
        buttonData.Columns.Add(column3);

        buttonData.PrimaryKey = new DataColumn[] { column1 };

        return buttonData;
    }

    public Buttons()
    {
        InitializeComponent();
        DataTable buttonData = makeButtonsTable();
        buttonGridView.DataSource = buttonData;
        buttonGridView.Columns["ID"].Visible = false;  
    }

    private void LaunchScreenSelection_Click(object sender, EventArgs e)
    {
        ss = new ScreenSelection(buttonData);
        ss.Show(this);
    }
}

Моя конечная цель состоит в том, чтобы информация, введенная в форму ScreenSelection, добавляла данные в представление данных, что, как я предполагаю, означает добавление их в таблицу данных, но я неЯ не знаю, ясно.

Когда я пытаюсь получить доступ к buttonData из LaunchScreenSelection_Click, это, конечно, говорит мне, что buttonData не существует в текущем контексте.Который, да, я вроде как ... но учитывая все, что я здесь строю, я понятия не имею, как заставить его существовать в текущем контексте.Все, что я пробовал, просто дает больше ошибок (я буду рад перечислить все попытки здесь, но ... это займет много времени).

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Правильный способ обработки этого сценария - через пользовательские события.

Давайте начнем с определения класса, который мы будем использовать для передачи информации между формой ScreenLocation и формой Buttons . Этот класс должен быть общедоступным и видимым для обоих классов форм (одно и то же пространство имен), он может находиться в своем собственном файле или просто добавляться в форму ScreenLocation / Buttons

public class ButtonData
{ 
    public int ID { get; set; }
    public string Name { get; set; }
    public Rectangle Rect { get; set; }
}

Теперь мы добавим код пластины котла, необходимый для определения события, вызванного ScreenLocation form

public class ScreenSelection : Form
{
     public delegate void onDataReady(ButtonData data);
     public event onDataReady DataReady;
     ....
}

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

protected void ButtonSave_Click(object sender, EventArgs e)
{
     // Anyone has subscribed to the event?
     if(DataReady != null)
     {
         ButtonData btn = new ButtonData();

         // Change these GetXXXXValue with the appropriate code 
         // that extracts the info from the ScreenLocation UI.
         btn.ID = GetTheIDValue();
         btn.Name = GetTheNameValue();
         btn.Rect = GetTheRectValue();

         // Send the info to the interested parties.
         DataReady(btn);
     }
}

Круг замыкается при создании экземпляра ScreenLocation в вашем коде из формы Buttons .

private void LaunchScreenSelection_Click(object sender, EventArgs e)
{
    ss = new ScreenSelection(buttonData);

    // Tell the ScreenLocation ss instance that we are 
    // interested to know when new data is ready
    ss.DataReady += myDataLoader;
    ss.Show(this);
}

// When the *ScreenLocation* instance will raise the event, 
// we will be called here to handle the event
private void myDataLoader(ButtonData btn)
{
     // Now you have your info from the ScreenLocation instance 
     // and you can add it to the datatable used as datasource for the grid 
     DataTable dt = AllEventData.Tables["AllEventData"];
     dt.Rows.Add(btn.ID, btn.Name, btn.Rect);
}
1 голос
/ 20 марта 2019

Если я правильно понимаю, переменная buttonData существует только локально в вашей функции makeButtonsTable ().Однако у вас есть глобальная переменная AllEventData , которая имеет ссылку на таблицу «ButtonData», поскольку вы добавили ее здесь.

   DataTable buttonData = AllEventData.Tables.Add("ButtonData");

Следовательно, вам нужно только отправить эту таблицу из AllEventDataв качестве параметра для ScreenSelection.

   private void LaunchScreenSelection_Click(object sender, EventArgs e)
   {
     ss = new ScreenSelection(AllEventData.Tables["ButtonData"]);
     ss.Show(this);
   }  
...