Программирование на C#

Требуется каждую секунду обновлять форму.
решил создать таймер, который бы вызывал опр. метод.
однако при попытке доступа к объектам на форме бросается исключение "другой поток владеет этим объектом".
как можно решить эту трудность?
 

ShaDer

Ословед
Требуется каждую секунду обновлять форму.
решил создать таймер, который бы вызывал опр. метод.
однако при попытке доступа к объектам на форме бросается исключение "другой поток владеет этим объектом".
как можно решить эту трудность?
эээ
если всё делать просто (кинуть timer на форму, в обработчике timer.tick вызывать this.invalidate() или refresh()), то всё делается в одном потоке и указанная ошибка просто не может появиться.
Исключение появляется из-за того, что refresh() вызывается из одного потока, а форма была создана в другом. Несколько Thread не создавали? С асинхронными методами (названия вида BeginXXX) не баловались?
 
эээ
если всё делать просто (кинуть timer на форму, в обработчике timer.tick вызывать this.invalidate() или refresh()), то всё делается в одном потоке и указанная ошибка просто не может появиться.
Исключение появляется из-за того, что refresh() вызывается из одного потока, а форма была создана в другом. Несколько Thread не создавали? С асинхронными методами (названия вида BeginXXX) не баловались?

опишу конкретней.
там не форма, а окно(класс window). пишу на WPF. создаю объект класса Timer(а визуального объекта таймер нет). надо обновлять текст в метке каждую сек. вот это и не получается.
 

Serge

Ословед
для WPF предназначен класс DispatcherTimer
Код:
private DispatcherTimer timer;

public Window1()
{
    InitializeComponent();
    Loaded += new RoutedEventHandler(Window1_Loaded);
}

void Window1_Loaded(object sender, RoutedEventArgs e)
{
    timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(1);
    timer.Tick += timer1_Tick;
    timer.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    timer.Stop();
    this.Close();
}
 

himera

Ословед
Вот такой вопрос. есть сайт на ASP.NET, C#. Авторизация пользователей реализована стандартными методами.

Имеется вот такой кусочеГ кода.
собственно отображает статус пользователей ONLINE\OFFLINE

MembershipUserCollection users;
users = Membership.GetAllUsers();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
if (users[GridView1.Rows.Cells[0].Text].IsOnline == true)
{
GridView1.Rows.Cells[2].ForeColor = System.Drawing.Color.Green;
GridView1.Rows.Cells[2].Text = "ONLINE";
}
if (users[GridView1.Rows.Cells[0].Text].IsOnline == false)
{
GridView1.Rows.Cells[2].ForeColor = System.Drawing.Color.Red;
GridView1.Rows.Cells[2].Text = "OFFLINE";
}
}

Он в принципе работает. НО !!! Обновление (допустим пользователь ушёл в офлайн) происходит минут через 5-10. и никак не могу причину найти. кто нибудь сталкивался с такой проблемой ???.

P.S. если понадобится:
Сервер БД MS SQL SERVER 2000
Сайт размещён в виртуальном каталоге IIS
Просьба сильно не ругаться. просто с вэб программированием столкнулся недавно
 
С WCF разобрался, базовые принципы понятны.
Теперь меня интересует литературка по workflow (WF). Есть что-нибудь? Пока что удалось найти только одну главу из книги по WCF, но было бы неплохо больше узнать об этом...

Пока что только такая найдена, может еще кто чем сможет помочь...
Microsoft.Press.Windows.Workflow.Foundation.Step.By.Step.pdf 8.09 Мб 57.[156-159]
 

Serge

Ословед
В ASP.Net за управление пользователями завуалированно отвечает класс наследованный от MembershipProvider, стандартный или самописный, его параметры настраиваются в файле web.config. Насколько точен данный пример - не знаю, нет возможности проверить, но думаю понятно в каком направлении дальше разбираться.
Код:
in System.Web - 
<membership defaultProvider="SqlProvider"
  userIsOnlineTimeWindow="5">
  <providers>
    ...
  </providers>
</membership>
 

strelok

Ословед
Как можно реализовать загрузку изображений в программу?
Теперь поясняю, что именно нужно. Имеется форма, на ней кнопка обзор, пользователь выбирает в открывшемся окне изображение на компьютере в любой папке. Адрес появляется в текстбоксе. Нажимаем загрузить и картинка копируется в рабочую папку с программой. Затем в новой форме открывается картинка.
Надеюсь, понятно описал. Помогите с реализацией, либо документацию подробную. Работаю в Visual Studio.
 
Как можно реализовать загрузку изображений в программу?
Теперь поясняю, что именно нужно. Имеется форма, на ней кнопка обзор, пользователь выбирает в открывшемся окне изображение на компьютере в любой папке. Адрес появляется в текстбоксе. Нажимаем загрузить и картинка копируется в рабочую папку с программой. Затем в новой форме открывается картинка.
Надеюсь, понятно описал. Помогите с реализацией, либо документацию подробную. Работаю в Visual Studio.

Скопировать картинку можно средствами Directory или DirectoryInfo (using System.IO), как мне кажется. При помощи чего-то вышеперечисленного просто выдирать название картинки и передавать в качестве параметра для метода, который грузит картинку на форму.
Как-то так.
 

Serge

Ословед
что-нибудь типа
Код:
using System.IO;
******
string path = txtImagePath.Text.Trim();
if (File.Exists(path))
{
  File.Copy(path, Directory.GetCurrentDirectory());
}
только вот использование каталога программы "на запись" является плохим стилем программирования, если программа будет установлена в Program Files, то будут проблемы с правами доступа под пользовательской учетной записью.

Для отображения картинки есть специальный компонент PictureBox, либо можно отрисовать вручную.
 
что-нибудь типа
Код:
using System.IO;
******
string path = txtImagePath.Text.Trim();
if (File.Exists(path))
{
  File.Copy(path, Directory.GetCurrentDirectory());
}
только вот использование каталога программы "на запись" является плохим стилем программирования, если программа будет установлена в Program Files, то будут проблемы с правами доступа под пользовательской учетной записью.

Для отображения картинки есть специальный компонент PictureBox, либо можно отрисовать вручную.

Можно всё сохранить в AppData которая доступна для записи(или же в большинстве случаев). Это если надо куда-то обязательно копировать.
Изящно это можно сделать так:
Код:
string folder = Environment.GetFolderPath(Environment.GetSpecialFolder.ApplicationData);
 

Serge

Ословед
Green[ek];9937441 написал(а):
Можно всё сохранить в AppData которая доступна для записи(или же в большинстве случаев). Это если надо куда-то обязательно копировать.
Изящно это можно сделать так:
Код:
string folder = Environment.GetFolderPath(Environment.GetSpecialFolder.ApplicationData);
угу, только точнее так
Код:
string folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

или можно просто использовать переменные окружения, типа %TEMP%
 

himera

Ословед
Вот такой вопрос. есть сайт на ASP.NET, C#. Авторизация пользователей реализована стандартными методами.

Имеется вот такой кусочеГ кода.
собственно отображает статус пользователей ONLINE\OFFLINE

MembershipUserCollection users;
users = Membership.GetAllUsers();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
if (users[GridView1.Rows.Cells[0].Text].IsOnline == true)
{
GridView1.Rows.Cells[2].ForeColor = System.Drawing.Color.Green;
GridView1.Rows.Cells[2].Text = "ONLINE";
}
if (users[GridView1.Rows.Cells[0].Text].IsOnline == false)
{
GridView1.Rows.Cells[2].ForeColor = System.Drawing.Color.Red;
GridView1.Rows.Cells[2].Text = "OFFLINE";
}
}

Он в принципе работает. НО !!! Обновление (допустим пользователь ушёл в офлайн) происходит минут через 5-10. и никак не могу причину найти. кто нибудь сталкивался с такой проблемой ???.

P.S. если понадобится:
Сервер БД MS SQL SERVER 2000
Сайт размещён в виртуальном каталоге IIS
Просьба сильно не ругаться. просто с вэб программированием столкнулся недавно

Нашёл решение вопроса.
Свойство userIsOnlineTimeWindow="5" в конфиге задает время в минута. По истечении которого пользователь уходит в офлайн.
Если поставить время равное 1 то по истечении времени пользователь уходит в офлайн даже если он на сайте, и что то делает.
Проблема решается вот такой строчкой.

Membership
.GetUser(true);

Она обновляет статус пользователя. Единственное что остаётся это вызывать метод в правильное время и правильном месте.

Спасибо Serge за подсказку, как выйти из ситуации
 

strelok

Ословед
Имеется таблица DataGridView, заполненная данными. Пользователь перемещается по строкам. Как можно определить номер строки, на которой пользователь остановился и, соответственно, передать её номер?
 

ShaDer

Ословед
Имеется таблица DataGridView, заполненная данными. Пользователь перемещается по строкам. Как можно определить номер строки, на которой пользователь остановился и, соответственно, передать её номер?

dataGridView1.SelectedRows[0].Index
Но лучше, если в строке будет поле - первичный ключ, однозначно определяющий запись. Тогда к нему можно будет обратиться так:
dataGridView1.SelectedRows[0].Cells["ключ"].Value
 
Награды
7
Имеется таблица DataGridView, заполненная данными. Пользователь перемещается по строкам. Как можно определить номер строки, на которой пользователь остановился и, соответственно, передать её номер?
Представь себе что другой пользователь вставил в таблицу N записей в разных местах. Теперь вопрос: "Какой стал номер строки теперь?"

В общем в базах данных такой вопрос как порядковый номер строки в таблице не имеет смысла.
 

strelok

Ословед
dataGridView1.SelectedRows[0].Index
Но лучше, если в строке будет поле - первичный ключ, однозначно определяющий запись. Тогда к нему можно будет обратиться так:
dataGridView1.SelectedRows[0].Cells["ключ"].Value
Я уже думал насчет первичного ключа, но мне не очень подходит это.. Используется что-то подобие ключа. Точнее столбец с id-номерами объектов, но они не последовательные, т.е. могут быть с пропусками.
Например: 1, 2, 3, 5, 7, 8, 9.
По-другому, как сравнение со значением находящимся в ячейке, я не вижу решения.

Представь себе что другой пользователь вставил в таблицу N записей в разных местах. Теперь вопрос: "Какой стал номер строки теперь?"

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

Я может как-то допотопно делаю или глупо :), не стоит судить строго.
 
Награды
7
У меня немного другая ситуация, напрямую данные в датагрид добавить нельзя, а используется как информационная таблица. Добавление происходит в другой форме и информации, не отображаемой в таблице по большей части, т.е. отображается самый минимум. Я может как-то допотопно делаю или глупо :), не стоит судить строго.
Информация в датагрид не добавляется. Она кем-то, где-то, когда-то добавляется в таблицу или связанные с ней таблицы, которая(ые) не есть одно и то-же что и датагрид. Датагрид только отображает информацию из таблицы или запроса. Точнее он всегда отображает информацию только из запроса, в самом простом случае вида
Код:
select * from MyTable;
. Выполнил refresh и всё, твои номера строк "поехали". Точнее, сейчас нет, завтра да, а послезавтра может быть снова да, а может быть снова нет. Они в принципе могут даже поехать и без изменения данных в таблице которую ты отображаешь. Если серверу явно не указан порядок вывода записей, то выдает он их клиенту как попало, т.е. сейчас на месте строки 5 окажется одна строка таблицы, а после рефреша другая. Даже если таблица не изменялась.
 
Сверху