Не получено ожидаемое значение, возвращаемое из метода publi c другой формы. Хотя работает нормально в том же классе или при возврате указанного значения c - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть две формы. Форма 5 и Форма 6. В Form5 есть публичный c метод SelectedEvent (). Когда я создаю переменную объекта Form5, она не возвращает правильное значение. Когда я вызываю метод из другого метода Form5 (того же класса), он работает. Теперь еще одна проводная вещь - когда я назначил значение c, которое будет возвращено внутри этого метода, его можно получить из формы Form6! Коды объяснят больше, я надеюсь -

(я пишу только необходимые компоненты из всего проекта.)

public partial class Form5 : Form
{
`\\there are many other methods too`

SqlConnection con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=FinalLabDairy;Integrated Security=True");
        int x;
        public Form5()
        {
            InitializeComponent();
        }

         public int SelectedEvent()
        {
            return this.x;
        }

`\\the method where i assigned the value of 'x':`
        private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            this.x = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["EID"].Value.ToString());
        }

`\\I'm sure the value has been assigned correctly because it works in the method below:`
        private void button4_Click(object sender, EventArgs e)
        {
            SqlCommand cmd = new SqlCommand(@"DELETE FROM [dbo].[Events] WHERE EID='"+SelectedEvent()+"'", con);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            int x = dataGridView1.SelectedRows[0].Index;
            dataGridView1.Rows.RemoveAt(x);
        }

}

Теперь в классе Form6 -


public partial class Form6 : Form
{
private void button1_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5();            
            SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[Events] SET [Date] = '" + dateTimePicker1.Text + "',[Time] = '" + dateTimePicker2.Text + "',[Title] = '" + txttitle.Text + "',[Description] = '" + txtdesc.Text + "',[Priority] = '" + comboBox1.Text + "',[LastMod] = '" + dateTimePicker1.Text + "'WHERE EID='"+ f.SelectedEvent() +"'", con);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
`\\i put this MessageBox just to see if the value of 'x' coming through correctly`
            MessageBox.Show(f.SelectedEvent().ToString());
        }
}

И теперь, к сожалению, f.SelectedEvent () не возвращает правильное значение. Вместо этого он возвращает '0'.

Забавно, когда я изменял возвращаемое значение в методе SelectedEvent (), как показано ниже -

public int SelectedEvent()
        {
            this.x = 1001;
            return this.x;
        }

Это работает как шарм. Я имею в виду значение 1001 возвращается внутри Form6, где вызывается f.SelectedEvent ()! Таким образом, похоже, что проблема возникает только тогда, когда метод вызывается из другой формы и значение x присваивается вне метода!

Я не знаю, почему он не возвращает назначенное значение x вместо 0! Кроме того, как он может возвращать указанное значение, назначенное в методе, но возвращая 0, если оно назначено из другого метода? Примечание. При назначении из другого метода он работает в той же форме, поэтому мы можем разобраться, что х не назначается должным образом. Также я попытался сделать 'x' и метод, используемый для присвоения 'Publi c', который тоже не работает.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

В button1_Click вы нигде не показываете f. Вы, кажется, пропали без вести f.Show(). Как вы ожидаете иметь выбранный индекс, если форма вообще не была активирована, пользователь не может ее увидеть и запустить обработчик событий Form5.dataGridView1_CellMouseClick, нажав dataGridview1?

Ваша первая проблема является то, что Form5.dataGridView1_CellMouseClick никогда не вызывается и, следовательно, x никогда не назначается. Ваша вторая проблема заключается в том, что запрос внутри button1_Click1 не должен запускаться до тех пор, пока пользователь не выберет что-то в dataGridView1, и вы не ждете этого, поэтому он будет выполняться независимо от того, выбрал ли пользователь что-то или нет. Этот запрос должен выполняться только тогда, когда Form5.dataGridView1 вызывает соответствующее событие. Поскольку вам нужно выполнить запрос внутри Form6, путь к go следующий:

  1. Создайте пользовательское событие c publi * в Form5, которое вызывается каждый раз при получении Form5.dataGridView1 событие инициируется.
  2. Подписаться Form6 на это событие
  3. Запустить запрос внутри обработчика событий в Form6, который обрабатывает пользовательское событие publi c, выставленное в Form5 .

И, наконец, я не уверен, что вы подписались на лучшее событие в dataGridView1. Разве что-то вроде SelectionChanged или RowEnter не будет лучшим вариантом?

В другом топи c, пожалуйста, начните привыкать называть объекты с разумными и понятными именами. Form5, Form6, dataGridView1 и др. c. просто отличный рецепт для будущих головных болей (для вас или для бедного парня, который наследует ваш код в будущем).

2 голосов
/ 14 апреля 2020
Form5 f = new Form5();  

Вы создали полностью новую форму 5 и каким-то образом ожидаете, что она будет содержать значение уже существующей, другой формы 5. Это все равно, что купить новую кабину IKEA inet того же производителя, что и другая, а потом удивляться, что ваши книги не в новой. Нет, книги все еще в старой.

Другой пример:

int x = 5;
int y = new int();

Вы удивитесь, узнав, что у , а не 5? Возможно нет. Это не новая концепция, вы уже знали это.

Чтобы получить значение вашей существующей Form5, вам нужно получить ссылку на нее и затем вызвать функцию по этой ссылке . Не по новой. Без большего количества кода трудно сказать, но в какой-то момент вы открываете экземпляр Form5, если это модальное диалоговое окно, сразу после закрытия это будет точка для получения этого значения. Если это не модальное диалоговое окно, вам нужно передать экземпляр Form5, открытый в методе вашей Form6, в качестве параметра, чтобы вы могли сохранить его для дальнейшего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...