Vijay_Meena701 Ответов: 2

Как открыть файл в новой вкладке, не открывая сначала новую вкладку? Я хочу, чтобы файл открывал новую вкладку для себя, когда он открывается


Я работал над этим проектом, но когда я открываю любой файл без предварительного открытия вкладки,он выдает исключение System.NullReferenceException.
вот этот код

private void openToolStripMenuItem_Click(object sender, EventArgs e)
       {
           Stream sp;
           OpenFileDialog op = new OpenFileDialog();
           op.Title = "Select File to Open";
           op.Filter = "All files (*.*)|*.*";
           if (op.ShowDialog() == DialogResult.OK)
           {
               if ((sp = op.OpenFile()) != null)
               {
                   string st = op.FileName;
                   string filetext = File.ReadAllText(st);
                   Getnew().Text = filetext;
               }
           }
       }


Что я уже пробовал:

Я пробовал использовать функцию потока, но она также выдает ту же ошибку.

CHill60

На какой линии

Vijay_Meena701

На этой линии
Сайт getnew().Text = filetext;

CHill60

Нам нужно увидеть код в Getnew() - я предполагаю (потому что я не вижу), что вы всегда хотите, чтобы Getnew возвращал объект - либо вкладку, открытую пользователем, либо позицию по умолчанию. Но мы не можем помочь без кода

Vijay_Meena701

Вот оно что возвращает
частная управления richtextbox сайт getnew()
{
RichTextBox r = null;
TabPage t = tabControl1.SelectedTab;
если (t != null)
{
r = t.Controls[0] as RichTextBox;
}
возвращение Р;
}

частная newToolStripMenuItem_Click недействительным(объект отправителя, EventArgs в электронной)
{
TabPage t = new TabPage("новый документ без названия");
RichTextBox r = новый RichTextBox();
r.Dock = DockStyle.Заполнить;
Т.Контроля.Добавить(r);
tabControl1.Вкладки.Добавить(t);
}

Vijay_Meena701

на самом деле ошибка заключается в том, что я установил команду пункта меню open strip для записи любого текста, который она собирает из файла, в getnew (), который представляет собой форматированное текстовое поле, прикрепленное к элементам управления вкладками
но ошибка заключается в том, что если я пытаюсь открыть любой файл без предварительного создания новой вкладки, которая затем пристыковывается к richtextbox, файловая программа выдает исключение, и я знаю, что это правильно, потому что я не сказал ей, что делать, когда возникает такой случай, поэтому мне нужно, чтобы она сначала создала новую вкладку, а затем пристыковалась к richtextbox, а затем каждый раз отображала содержимое файла.

CHill60

Вроде того, что я сказал в решении, которое я опубликовал

Vijay_Meena701

извините, но это не работает
кстати я покончил с этой проблемой используя этот код

если (z == null)
{
TabPage newPage = новая вкладка();
tabControl1.Вкладки.Добавить(newPage);
RichTextBox rtb = новый RichTextBox();
РТБ.Док = DockStyle.Заполнить;
новая страница.Управления.Добавить(rtb);
box = newPage.Элементы управления[0] как RichTextBox;
}

теперь у меня есть новая проблема, чтобы отобразить имя файла, который открыт в заголовке вкладки

CHill60

Принцип тот же - если его там нет, то добавьте его.
Что касается имени файла в заголовке вкладки, то из вашего кода выше

newPage.Text = filename;

Vijay_Meena701

Вообще-то я новичок в этой области.
Не могли бы вы дать мне представление о том, как показать имя файла, который в данный момент открыт, чтобы он отображался в заголовке вкладки.

CHill60

Я только что это сделал ...

newPage.Text = filename
где filename это имя файла, который вы открыли - вы не поделились этим кодом, поэтому я не могу использовать ваши имена переменных

Richard MacCutchan

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

Vijay_Meena701

На этой линии
Сайт getnew().Text = filetext;

Richard MacCutchan

Так что же возвращает Getnew?

Vijay_Meena701

Он открывает новый элемент управления вкладкой заполненный форматированным текстовым полем когда пользователь нажимает кнопку

Richard MacCutchan

Ну, очевидно, что нет.

Vijay_Meena701

Я знаю что это не так вот в чем проблема я хочу чтобы он показывал открытую новую вкладку без запроса пользователя каждый раз

Richard MacCutchan

И, может быть, вы думаете, что мы можем догадаться, как это может произойти?

Vijay_Meena701

Ладно братан я предоставлю тебе полный код по электронной почте до завтрашнего дня на самом деле уже поздно в моей стране
Просто дай мне свой электронный идентификатор

Richard MacCutchan

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

Vijay_Meena701

Прости меня за все, что я сказал, что ты считаешь неправильным.
Спасибо за "попытку помочь".

Richard MacCutchan

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

2 Ответов

Рейтинг:
2

CHill60

После операции выкладываю еще какой-то код...

Если вы пройдете через свой код, то в первый раз поймете, что t равно нулю, поэтому он перескакивает на строку return r;... но вы только установили r в null.
Попробуйте что-нибудь вроде этого (непроверенное)

private RichTextBox Getnew()
 {

     TabPage t = tabControl1.SelectedTab;
     if (t == null)
     {
          t = tabControl1.TabPages[0]; // point to first tabpage
     }
     return t.Controls[0] as RichTextBox;

}

или
private RichTextBox Getnew()
 {
     if(tabControl1.SelectedIndex < 0) tabControl1.SelectedIndex = 0; //actuall select the first tab

     TabPage t = tabControl1.SelectedTab;
     return t.Controls[0] as RichTextBox;

}


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


Рейтинг:
1

OriginalGriff

Если он потерпит неудачу на этой линии:

Getnew().Text = filetext;

тогда что угодно Getnew это делает, он возвращает нулевое значение - поэтому при попытке получить свойство Text (или любое другое свойство, или использовать любой метод) вы получите ошибку ссылки numm. Вы не можете "исправить" это - то, что происходит, абсолютно правильно и правильно.

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите программу в отладчике и поставьте точку останова на этой строке. Когда он достигнет его, VS остановится и позволит вам взять управление на себя. Затем вы можете войти в метод, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!