В этом то и проблема Все упирается в то, что в конечный метод, в котором мы записываем обратно данные в БД, мы можем передать любые данные через Session из первоначальной формы. Но вот какие данные к примеру можно передать, что бы в конце концов не делать так: if (table == T1) { ... } if (table == T2) { ... } В идеале нужно получить что то такое: Update(object obj) { ... } где object наша таблица с которой мы уже работаем.
1) Попробуй использовать информацию о типе объекта. По типу объекта можно однозначно определить, из какой таблицы он пришел. 2) Передавай на страницу дополнительный параметр, чтобы понять, из какой таблицы производилась выборка. 3) Пересмотри архитектуру приложения. Навскидку - организуй что-то вроде MVC, где контроллер создается фабрикой, смотря по идентификатору таблицы. Поясню: Запросили URL: http://localhost/Edit.aspx?table=1 В коде страницы: выцепляй параметр table из query-строки и передавай его в фабрику: PHP: var tableParameter = Request.QueryString["table"]; if(!string.IsNullOrEmpty(tableParameter)) { int tableId; if(int.TryParse(tableParameter, out tableId)) { this.controller = this.controllerFactory.Create(tableId); return; } } throw new ArgumentException("таблица не указана или указана неверно."); А сам конроллер - такая вещь: PHP: // базовый класс, в нем - интерфейс и общая часть логики. public abstract class BaseEditPageController { public void SaveData(Page page) { using(var db = new DbDataContext()) { SaveDataToDb(db, page); } } protected abstract void SaveDataToDb(DbDataContextdb, Page pageRef); } public class UserInfoEditPageController : BaseEditPageController { protected override void SaveDataToDb(DbDataContextdb, Page pageRef) { // а здесь - логика записи в базу для таблицы "user_info" } } Соответственно, фабрика просто создает нужный контроллер, сюдя по идентификатору таблицы. Решение придумывалось сходу, посему не претендует на законченность
Ну не долго думая, сделал так: Форма с начальной таблицей T1: this.Session["Type"] = new Type1(); или Т2: this.Session["Type"] = new Type2(); Форма редактирования: Class.Upd(Session["Type"]); Метод: public static void Upd(object obj) { if(obj is Type1) { .... } if(obj is Type2) { .... } } Т.е. тут мы уже не привязаны к названию таблицы, что дает нам право смело их переименовывать, но сущностный класс придется теперь либо приводить к Type1 || Type2, либо переписывать Type1 || Type2 под новые классы. Что скажете, может быть это совсем глупо и есть очевидные решения данной проблемы?
Пардон, а не проще ли сделать так: enum ClassType { Class1, Class2, Class3 } потом: this.Session["Type"] = ClassType.Class1; или this.Session["Type"] = ClassType.Class2; а дальше private void Update(object value) // не static, я так понимаю, это не критично? { var t = (ClassType)this.Session["Type"]; switch(t) { case ClassType.Class1: var objectToSave = (Class1)value; break; case ClassType.Class2: var objectToSave = (Class2)value; break; case ClassType.Class3: var objectToSave = (Class3)value; break; default: throw new ArgumentException(); } } И кстати, этим данным в сессии делать нечего, сессия - она одна на пользователя, а эти данные - привязаны к одной конкретной странице. Т.е. я всегда могу открыть 3 копии этой страницы и редактировать в каждой данные из разных таблиц. Если хранить данные о типе в сессии - начнутся конфликты.
Кто знает как решить еще такую проблему: Вытаскиваем из БД при помощи LinqDataSource ID страниц "PageID" и записываем их в GridView. Далее из второй таблицы БД вытаскиваем страницы и говорим, что нам нужны только те страницы ID которых совпадает с контролом GridView (т.е. с PageID). Соответсвенно при выводе из второй таблицы мы должны получить лишь строки ID которых равен PageId из первой таблицы. Но тут появляется такая ошибка: Оператор "==" несовместим с типами операнда "Int32" и "Object" Что немудрено, ведь кто знает какие данные были записаны в GridView? Вот тут и возникает вопрос. Как же бороться с такой проблемой? Писать свои подключение к БД? Но тут придется тогда еще и обработчики вставки\удаления\добавления писать, что уже накладно, не в силу сложность, но в силу лишнего кода изобретающего велосипед =( Подскажите, наверняка ведь можно сделать выборку из одной таблицы и потом по ней сделать выборку из второй таблицы.
Это все происходит в конструкторе, не пишется не строчки кода, все делается при помощи контролов asp.net.
Вот нашел пример: PHP: <asp:DropDownList AutoPostBack="true" ID="DropDownList1" runat="server"> <asp:ListItem Value="0">0</asp:ListItem> <asp:ListItem Value="25">25</asp:ListItem> <asp:ListItem Value="100">100</asp:ListItem> <asp:ListItem Value="400">400</asp:ListItem> </asp:DropDownList> <asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" Where="Price > @UserPrice" ID="LinqDataSource1" runat="server"> <WhereParameters> <asp:ControlParameter Name="UserPrice" DefaultValue="0" ControlID="DropDownList1" Type="Int32" /> </WhereParameters> </asp:LinqDataSource> <asp:GridView DataSourceID="LinqDataSource1" ID="GridView1" runat="server"> </asp:GridView> Единственное отличие от моего случая в том, что мне нужно не выбирать по 1 элементу из DropDownList'a а сразу передать в LinqDataSource несколько элементов из таблицы, что бы по ним уже выбирать какие данные читать из другой таблицы.
Вопросик по C#. Как можно сделать хот кей к кнопке? т.е. что бы прога свёрнута, но хот кей сработал. Спасибо.
1. TextBox tb=new TextBox(); и заполняешь поля класса: расположение на форме и т.д. 2. Никак, объявляй массив TextBox'ов: TextBox[] tb=new TextBox[12];
Элементу формы нужен парент контрол, я хз где там у тебя textbox-ы должны появляться, но допустим что в groupBox1, тогда - this.groupBox1.Controls.Add(this.tbb12);, ну или сразу на главную форму - this.Controls.Add(this.tbb12); Что то не пойму вопроса, в чем трабл то? Как описали выше создаем массив textbox-ов указанной размерности, в цикле размешаем на форме.
есть такие таблицы Code: <tr onclick="NewToggleLayer('layer_[COLOR=Green]6986[/COLOR]')" class="list"> <td class="_center"><img alt="cstrike" title="cstrike" src="templates/_gfx/games/cstrike.gif" /></td> <td>2010-09-20</td> <td><img alt="" src="templates/_gfx/country/kz.png" /> DVD*</td> <td>[COLOR=Green][live-surf]*[Alexey]^[/COLOR]</td> <td>kill from respawn</td> ..... ..... ..... ..... </tr> Как можно спарсить всё что помечено зелёным и вывести как [live-surf]*[Alexey]^ = 6986 ?
Держи Code: data = data.Replace("\r", string.Empty).Replace("\n", string.Empty); string pattern = "<tr onclick=\"NewToggleLayer(.{2})layer_(?<rank>.+?)(.{2})\" class=\"list\">(.+?)<img alt=\"\" src=\"(.+?)\" />(.+?)<td>(?<nick>.+?)</td>"; MatchCollection matchCollection = Regex.Matches(data, pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); //[live-surf]*[Alexey]^ = 6986 string nickRank = string.Format("{0} = {1}", matchCollection[0].Groups["nick"].Value, matchCollection[0].Groups["rank"].Value);
Да нет, не какого цикла не надо.Смотришь matchCollection.Count - сколько всего коллекций столько и спаршено ников+статистик.Выводить так -> matchCollection.Groups["nick"].Value (там где i - любое число не превышающие придел коллекции).