Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение с разных закладок, помогите разобраться 
:(
    Опции темы
xa3apg
Дата 11.10.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Доброго времени суток smile

Делаю такстовый редактор с подсветкой синтаксиса для самодельного скриптового языка. Решил сделать открытие каждого файла в отдельной закладке. Вот что у меня есть :
Код

private void toolStripButton1_Click(object sender, EventArgs e) //создание чистого документа
        {
            TabPage page = new TabPage("Noname"+((tabControl1.TabPages.Count+1)).ToString());
            page.Name = "Noname" + ((tabControl1.TabPages.Count + 1)).ToString();
            tabControl1.TabPages.Add(page);
            tabControl1.SelectedTab = page;

            RichTextBox edit = new RichTextBox();
            edit.Dock = DockStyle.Fill;
            edit.Enter += new EventHandler(edit_Enter);
            edit.BackColor = System.Drawing.SystemColors.InactiveCaption;
            edit.Name ="rich-"+page.Name;
            page.Controls.Add(edit);
            
        }

        void edit_Enter(object sender, EventArgs e) // как я понял надо чтото в этом роде сделать для сохранения :(
        {
            MessageBox.Show(((RichTextBox)sender).Name);
        }

Как мне сделать сохранение документа с RichTextBox'a в активной закладке? У меня не получается получить сам объект при смене закладки...нашел только при условии что он является сендером
Код

((RichTextBox)sender).Name

я уже пытался (может это и тупо конечно =\) давать закладке и ричу в ней одинаковые имена , но ричу подставлял суффик, но обращение типа
Код

object asd="Rich"+tabControl1.SelectedTab.Name;
MessageBox.Show(this.Controls[asd].Name);

выдавало ошибку, мол, нет ссылки на объект.

Смотрел рефлектором похожий блокнот...там через хэш массив обращались к ричам...но когда я попробовал сделать анологично, мне тоже начало кричать что нет ссылки на объект. :(
PM MAIL   Вверх
elbjarn
Дата 11.10.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(xa3apg @  11.10.2008,  09:29 Найти цитируемый пост)
я уже пытался (может это и тупо конечно =\) давать закладке и ричу в ней одинаковые имена , но ричу подставлял суффик, но обращение типа
Выделить всёкод C#
1:
2:
    
object asd="Rich"+tabControl1.SelectedTab.Name;
MessageBox.Show(this.Controls[asd].Name);

выдавало ошибку, мол, нет ссылки на объект.


это потому, что this - ссылка на Form. В ее коллекции контролов не содержится ваших ричей, там находятся только TabPage, в коллекции контролов которых, в свою очередь, находится искомый ричтектсбокс.
Код

RichTextBox rtb = (RichTextBox)(tabControl1.SelectedTab.Controls["rich-" + tabControl1.SelectedTab.Name]);

это если делать по вашему пути, искать в коллекции контролов по имени. 
можно сделать небольшой словарик, где ключи будут - ссылки на TabPage, а значения - ссылки на RichTextBox.
но лучше всего - унаследовать контрол от TabPage, в этом контроле определить RichTextBox, и сделать метод у TabPage, типа Save(), который сохраняет содержимое RichTextBox.
PM MAIL ICQ   Вверх
xa3apg
Дата 14.10.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Цитата(elbjarn @  11.10.2008,  11:01 Найти цитируемый пост)
но лучше всего - унаследовать контрол от TabPage, в этом контроле определить RichTextBox, и сделать метод у TabPage, типа Save(), который сохраняет содержимое RichTextBox.

То что надо. Сделал класс от TabPage и в нем создал контрол, теперь сохраняет нормально. Только встал другой вопрос :
хочу чтобы в тексте закладки при модификации текста подставлялся знак "*" в конце имени файла, а при сохранении убирался. Вроде сделал:
создал 
Код

private bool txtChanged = false ; 

в TextChanged класс добавил :

Код


if (!txtChanged)
{
Tab1.Text = info.Name + "*"; // info.Name - просто откидывает полный путь к файлу и оставляет только название
txtChanged = true;
}


С новыми документами работает прекрасно, но вот когда я открываю какой-либо готовый скрипт, то мне моментально ставится звездочка в имени (я то понимаю что он выполняется при создании ричбокса, и уже добавление текста с файла считает модификацией). Пытаюсь в открытии принудительно ставить 
Код

txtChanged =  true;

но он как будто его не замечает  smile 

Это сообщение отредактировал(а) xa3apg - 14.10.2008, 11:03
PM MAIL   Вверх
elbjarn
Дата 14.10.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(xa3apg @  14.10.2008,  10:35 Найти цитируемый пост)
Пытаюсь в открытии принудительно ставить 
Выделить всёкод C#
1:
    
txtChanged =  true;

но он как будто его не замечает  smile 


проблема решилась бы, если бы вы использовали вместе с  полем txtChanged пару функций, к примеру, SetAsteriskName() и SetClearName(). в этих функциях, соответственно, вы изменяете имя закладки на зведочку или без звездочки. функции эти вызывать при TextChanged у ричтекстбокса и при вызове Save(). только чтобы не обновлять при каждом вводе символа название закладки, как раз-таки проверять значение поля txtChanged,  или если оно true, то не вызывать функцию.
примерно так (код пишу от руки):
Код

public void Save()
{
  // здесь сохранить текст
  SetClearName();
}
bool txtChanged = false;
protected void TextChanged(sender e, EventArgs e)
{
  // здесь сохранить текст
  if (!txtChanged)
    SetAsteriskName();
}

public void SetClearText()
{
  // убрать звездочку

  txtChanged = false;
}


public void SetAsteriskText()
{
  // сделать зведочку

  txtChanged = true;
}


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.