[ C# / Java ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by procedure, 2 Nov 2008.

  1. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    В этом то и проблема ;)

    Все упирается в то, что в конечный метод, в котором мы записываем обратно данные в БД, мы можем передать любые данные через Session из первоначальной формы. Но вот какие данные к примеру можно передать, что бы в конце концов не делать так:

    if (table == T1)
    {
    ...
    }
    if (table == T2)
    {
    ...
    }

    В идеале нужно получить что то такое:

    Update(object obj)
    {
    ...
    }
    где object наша таблица с которой мы уже работаем.
     
    1 person likes this.
  2. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    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(tableParameterout 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(dbpage);
        }  
      }

      protected abstract 
    void SaveDataToDb(DbDataContextdbPage pageRef);
    }

    public class 
    UserInfoEditPageController BaseEditPageController
    {
      protected 
    override void SaveDataToDb(DbDataContextdbPage pageRef)
      {
        
    // а здесь - логика записи в базу для таблицы "user_info"
      
    }
    }
    Соответственно, фабрика просто создает нужный контроллер, сюдя по идентификатору таблицы.
    Решение придумывалось сходу, посему не претендует на законченность :)
     
  3. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    Ну не долго думая, сделал так:

    Форма с начальной таблицей 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 под новые классы.

    Что скажете, может быть это совсем глупо и есть очевидные решения данной проблемы?
     
  4. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    2Bers: спасибо за ответ, обязательно рассмотрю и если понравится один из вариантов перепишу.
     
  5. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Пардон, а не проще ли сделать так:

    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 копии этой страницы и редактировать в каждой данные из разных таблиц. Если хранить данные о типе в сессии - начнутся конфликты.
     
  6. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    Кто знает как решить еще такую проблему:
    Вытаскиваем из БД при помощи LinqDataSource ID страниц "PageID" и записываем их в GridView. Далее из второй таблицы БД вытаскиваем страницы и говорим, что нам нужны только те страницы ID которых совпадает с контролом GridView (т.е. с PageID). Соответсвенно при выводе из второй таблицы мы должны получить лишь строки ID которых равен PageId из первой таблицы. Но тут появляется такая ошибка:
    Оператор "==" несовместим с типами операнда "Int32" и "Object"

    Что немудрено, ведь кто знает какие данные были записаны в GridView? Вот тут и возникает вопрос. Как же бороться с такой проблемой? Писать свои подключение к БД? Но тут придется тогда еще и обработчики вставки\удаления\добавления писать, что уже накладно, не в силу сложность, но в силу лишнего кода изобретающего велосипед =(

    Подскажите, наверняка ведь можно сделать выборку из одной таблицы и потом по ней сделать выборку из второй таблицы.
     
  7. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Немного не вьехал в вопрос...А .ToString() не помогло?
     
  8. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    Это все происходит в конструкторе, не пишется не строчки кода, все делается при помощи контролов asp.net.
     
  9. freeseth

    freeseth New Member

    Joined:
    29 Aug 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0

    Вот нашел пример:
    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 несколько элементов из таблицы, что бы по ним уже выбирать какие данные читать из другой таблицы.
     
  10. Charle

    Charle Member

    Joined:
    10 Aug 2010
    Messages:
    18
    Likes Received:
    5
    Reputations:
    4
    Вопросик по C#.
    Как можно сделать хот кей к кнопке? т.е. что бы прога свёрнута, но хот кей сработал. Спасибо.
     
  11. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    к своей программе (сорцы есть)?
     
  12. Iggy

    Iggy New Member

    Joined:
    24 Jun 2010
    Messages:
    104
    Likes Received:
    4
    Reputations:
    1
    Form1.KeyPreview = true;
    добавь KeyDown event => .. if (e.keycode == keys.return) ...
     
  13. .ATK

    .ATK Active Member

    Joined:
    20 Feb 2009
    Messages:
    143
    Likes Received:
    111
    Reputations:
    9
    1. TextBox tb=new TextBox(); и заполняешь поля класса: расположение на форме и т.д.
    2. Никак, объявляй массив TextBox'ов:
    TextBox[] tb=new TextBox[12];
     
    1 person likes this.
  14. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Элементу формы нужен парент контрол, я хз где там у тебя textbox-ы должны появляться, но допустим что в groupBox1, тогда - this.groupBox1.Controls.Add(this.tbb12);, ну или сразу на главную форму - this.Controls.Add(this.tbb12);
    Что то не пойму вопроса, в чем трабл то?
    Как описали выше создаем массив textbox-ов указанной размерности, в цикле размешаем на форме.
     
    #654 PaCo, 20 Sep 2010
    Last edited: 20 Sep 2010
  15. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    есть такие таблицы
    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 ?
     
  16. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Держи

    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);
     
    2 people like this.
  17. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    т.е. это загнать в цикл и обрабатывать в цикле, если таблиц несколько?
    Что нужно подключить?(using)
     
  18. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Т.е таблиц?Каких?Немного тебя не понял.
     
    #658 CodeSender:), 21 Sep 2010
    Last edited: 21 Sep 2010
  19. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    html таблицы, <table></table> :)
     
  20. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Да нет, не какого цикла не надо.Смотришь matchCollection.Count - сколько всего коллекций столько и спаршено ников+статистик.Выводить так -> matchCollection.Groups["nick"].Value (там где i - любое число не превышающие придел коллекции).
     
Loading...
Similar Threads - Java начинающим задаем
  1. b3
    Replies:
    4
    Views:
    3,322