.net (dotnet) Faq

Тема в разделе "Codebase - Общий по .NET и C#", создана пользователем qDude, 18 мар 2006.

Статус темы:
Закрыта.
  1. qDude

    qDude Гость

    Давайте создавать FAQ по .NET. Если хотите - начну!

    Как достать из сборки Embedded Resource?
    Ниже приведены примеры.

    Достаем текстовый файл, например файл с клиентским javascript'ом.

    Код (Text):
    using System;
    using System.IO;
    using System.Reflection;

    ...

    using(StreamReader reader = new StreamReader(
    Assembly.GetExecutingAssembly().GetManifestResourceStream("[resourceName]")))
    {
    string s = reader.ReadToEnd();
    }
    Достаем картинку.

    Код (Text):
    using System;
    using System.Drawing;
    using System.Reflection;

    ...

    Image img = Image.FromStream(
    Assembly.GetExecutingAssembly().GetManifestResourceStream("[resourceName]"));
     
  2. Guest

    Guest Гость

    Как программно создать и заполнить данными XmlDocument?

    Ниже представлен код консольного приложения, которое программно формирует XmlDocument и выводит его содержимое на экран.

    Код (Text):
    using System;
    using System.Xml;

    public class XmlCreationSample
    {
    public static void Main()
    {
     
     XmlDocument doc = new XmlDocument();
     doc.AppendChild(doc.CreateXmlDeclaration("1.0","utf-8",null));
     //doc.AppendChild(doc.CreateProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""));

     XmlNode rootNode = doc.AppendChild(doc.CreateElement("books"));
     
     for(int i = 0;i < 4; i++ ){
      XmlNode bookNode = rootNode.AppendChild(doc.CreateElement("book"));
     
      XmlNode titleNode = bookNode.AppendChild(doc.CreateElement("title"));
      titleNode.InnerText = "some title";
     
      XmlNode authorNode = bookNode.AppendChild(doc.CreateElement("author"));
      authorNode.InnerText = "some author";
     }
     
     Console.WriteLine(doc.OuterXml);
     Console.ReadLine();
    }
    }
     
  3. qDude

    qDude Гость

    Как получить зарегистрированное описание файлового расширения?

    Пример ниже достает описание тектового файла.

    Код (Text):
    using System;
    using System.Runtime.InteropServices;
    using System.ComponentModel;

    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEINFO
    {
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
    }


    public class TestClass
    {
    public const uint SHGFI_TYPENAME = 0x000000400;
    public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;

    [DllImport("Shell32.dll")]
    public static extern IntPtr SHGetFileInfo(
     string pszPath,
     uint dwFileAttributes,
     ref SHFILEINFO psfi,
     uint cbFileInfo,
     uint uFlags);

    [STAThread]
    public static void Main()
    {
     SHFILEINFO shfi = new SHFILEINFO();
     SHGetFileInfo("*.txt", 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
     Console.WriteLine(shfi.szTypeName);
     Console.ReadLine();
    }
    }
     
  4. qDude

    qDude Гость

    Как прочитать файл c русским текстом?

    Код (Text):
    using System;
    using System.Text;
    using System.IO;

    namespace Test
    {

    public class TestClass
    {

     [STAThread]
     public static void Main()
     {
      using (StreamReader reader = new StreamReader("c:\\test.txt",Encoding.GetEncoding("windows-1251")))
      {
       string s = reader.ReadToEnd();
       Console.WriteLine(s);
      }
      Console.ReadLine();

     }
    }
    }
     
  5. qDude

    qDude Гость

    Как добавить пользователя в Active Directory, установить пароль и активировать учетную запись?

    В данном примере показано как создать пользователя в AD, назначить ему пароль, logonName и активировать полученную учетную запись. Также приведена функция, создающая/устанавливающая любое свойство объекта AD.

    Код (Text):
    using System;
    using System.DirectoryServices;

    namespace DirectoryServicesSamples
    {
    class ADSamples
    {
     //Параметры создаваемой учетной записи
     public enum ADAccountOptions
     {
      UF_TEMP_DUPLICATE_ACCOUNT = 0x0100,
      UF_NORMAL_ACCOUNT =0x0200,
      UF_INTERDOMAIN_TRUST_ACCOUNT =0x0800,
      UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,
      UF_SERVER_TRUST_ACCOUNT =0x2000,
      UF_DONT_EXPIRE_PASSWD=0x10000,
      UF_SCRIPT =0x0001,
      UF_ACCOUNTDISABLE=0x0002,
      UF_HOMEDIR_REQUIRED =0x0008,
      UF_LOCKOUT=0x0010,
      UF_PASSWD_NOTREQD=0x0020,
      UF_PASSWD_CANT_CHANGE=0x0040,
      UF_ACCOUNT_LOCKOUT=0X0010,
      UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED=0X0080,
     }

     [STAThread]
     static void Main(string[] args)
     {
      //Имя контроллера домена domain, DNS адрес домена domain.organization.com
      //В случае, если добавляем пользователя в OrganizationalUnit AD, то вместо CN=Users пишем
      //OU = Organizational Unit Name
      AddUser("domain/CN=Users,DC=domain,DC=organization,DC=com",@"NewUser","AdminPassword");
      Console.ReadLine();
     }

     public static void AddUser(string strDoamin, string strLogin, string strPwd)
     {
      try
      {
       DirectoryEntry obDirEntry = new DirectoryEntry("LDAP://" + strDoamin,@"domain\admin","AdminPWD");
       DirectoryEntry obUser = obDirEntry.Children.Add("CN=" + strLogin, "user");
       obDirEntry.Close();
       //Пользователь еще не добавлен в AD. Для сохранения изменений используем метод CommitChanges();
       obUser.CommitChanges();
       
       //Устанавливаем пароль
       obUser.Invoke("SetPassword", strPwd);
       obUser.CommitChanges();
       Console.WriteLine("Пароль установлен");
       
       //Устанавливаем Logon Name
       //Для NT
       SetProperty(ref obUser, "samAccountName",strLogin);
       //Начная с Windows 2000
       obUser.Invoke("Put", new object[] {"userPrincipalName", strLogin + "@domain.organization.com"});
       obUser.CommitChanges();
       Console.WriteLine("Logon Name установлен");
       
       //Активируем созданную учетную запись
       obUser.Properties["userAccountControl"][0]=ADAccountOptions.UF_NORMAL_ACCOUNT;
       obUser.CommitChanges();
       Console.WriteLine("Учетная запись активирована");
       
       //Устанавливаем необходимые параметры лдя созданного пользователя
       SetProperty(ref obUser, "givenName","Best of The Tester");
       obUser.Close();
      }
      catch (Exception ex)
      {
       Console.Write(ex.Message);
       //Пишим Error Log
      }
     
     }
     
     public static void SetProperty(ref DirectoryEntry obUser, string propertyName, string propertyValue)
     {
      //Если заданное поле существует, то
      if(obUser.Properties.Contains(propertyName))
      {
       //изменяем его значение
       obUser.Properties[propertyName][0]=propertyValue;
      }
      else
      {
       //добавляем данное поле
       obUser.Properties[propertyName].Add(propertyValue);
      }
      obUser.CommitChanges();
      Console.WriteLine(string.Format("Параметр '{0}' установлен",propertyName));
     }

    }
    }
     
  6. qDude

    qDude Гость

    Как изменить пароль пользователя в Active Directory?

    Существует два варианта изменения пароля пользователя. В одном случае мы действуем от имени самого пользователя, в другом случае от имени администратора.



    Изменение пароля от имени администратора.
    Код (Text):
    using System;
    using System.Collections;
    using System.DirectoryServices;

    public class MyClass
    {
    public static void Main()
    {
     DirectoryEntry deUser = GetUser(strLogonName);
     //Изменяем пароль при помощи метода AD "SetPassword"
     deUser.Invoke("SetPassword", strNewPassword);
     deUser.CommitChanges();
     deUser.Close();
     Console.ReadLine()
    }

    //Поиск пользователя по Logon Name
    private static DirectoryEntry GetUser(string strLogonName)
    {
     DirectoryEntry rootDE = new DirectoryEntry("LDAP://domain", strAdminLogonName, strAdminPassword);
     DirectorySearcher deSearch = new DirectorySearcher(rootDE);
     deSearch.Filter = string.Format( "(&(objectClass=user)(samAccountName={0}))",strLogonName);
     deSearch.SearchScope = SearchScope.Subtree;
     SearchResult result = deSearch.FindOne();
     rootDE.Close();

     if(result !=null)
     {
      //Возвращаем DirectoryEntry полученную от имени администратора
      return new DirectoryEntry(result.Path,string.Format("domain\\{0}",strAdminLogonName),strAdminPassword);
     }
     else
     {
      return null;
     }
    }
    }
    Изменение пароля от имени пользователя.
    Код (Text):
    using System;
    using System.Collections;
    using System.DirectoryServices;

    public class MyClass
    {
    public static void Main()
    {
     DirectoryEntry deUser = GetUser(strLogonName,strOldPassword);
     //Изменяем пароль при помощи метода AD "ChangePassword", т.к. "SetPassword" доступен только администратору
     deUser.Invoke("ChangePassword", new object[] {strOldPassword,strNewPassword});
     deUser.CommitChanges();
     deUser.Close();
     Console.ReadLine()
    }

    //Поиск пользователя по Logon Name
    private static DirectoryEntry GetUser(string strLogonName, string strPassword)
    {
     DirectoryEntry rootDE = new DirectoryEntry("LDAP://domain", strLogonName, strPassword);
     DirectorySearcher deSearch = new DirectorySearcher(rootDE);
     deSearch.Filter = string.Format( "(&(objectClass=user)(samAccountName={0}))",strLogonName);
     deSearch.SearchScope = SearchScope.Subtree;
     SearchResult result = deSearch.FindOne();
     rootDE.Close();

     if(result !=null)
     {
      //Возвращаем DirectoryEntry полученную от имени пользователя
      return new DirectoryEntry(result.Path,string.Format("domain\\{0}",strLogonName),strPassword);
     }
     else
     {
      return null;
     }
    }
    }
     
  7. qDude

    qDude Гость

    Как получить список доступных доменов?

    Ниже приведен пример:

    Код (Text):
    using System;
    using System.DirectoryServices;

    namespace DirectoryServicesSamples
    {
    class DomainListApp
    {
     [STAThread]
     static void Main(string[] args)
     {
      DirectoryEntry deRootDSE = new DirectoryEntry("LDAP://RootDSE");
      string sRootDomain = "LDAP://" + deRootDSE.Properties["rootDomainNamingContext"].Value.ToString();

      DirectoryEntry deRoot = new DirectoryEntry(sRootDomain);

      DirectorySearcher dsFindDomains = new DirectorySearcher(deRoot);
      dsFindDomains.Filter = "(objectClass=domainDNS)";
      dsFindDomains.SearchScope = SearchScope.Subtree;

      dsFindDomains.PropertiesToLoad.AddRange(new string[] {"distinguishedName", "name"} );

      foreach(SearchResult srDomain in dsFindDomains.FindAll())
      {
       Console.WriteLine(string.Format("{0} ({1})",
        srDomain.Properties["name"][0],
        srDomain.Properties["distinguishedName"][0]));
      }
      Console.ReadLine();
     }
    }
    }
     
  8. qDude

    qDude Гость

    Как программно изменить размеры изображения?

    1) Быстрый способ, очень низкое качество для больших картинок:
    Код (Text):
    public static Image ResizeImage( Image img, int newWidth, int newHeight ) {
    return img.GetThumbnailImage( newWidth, newHeight, null, IntPtr.Zero );
    }


    2) Качественный способ:
    Код (Text):
    public static Image ResizeImage( Image img, int newWidth, int newHeight ) {
    Image thumbImg = new Bitmap( newWidth, newHeight );

    using( Graphics gr = Graphics.FromImage( thumbImg ) )
    {
     gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
     gr.DrawImage(
      img,
      new Rectangle( 0, 0, newWidth, newHeight ),
      0, 0,
      img.Width, img.Height,
      GraphicsUnit.Pixel
      );
    }
    return thumbImg;
    }
     
  9. qDude

    qDude Гость

    Как добавить подтверждение на кнопку?

    Добавление подтверждения на отделную кнопку
    Код (Text):
    <%@ Page language="c#"%>
    <html>
     <head>
       <script runat="server">
         void Page_Load(object sender, EventArgs e) {
           _myButton.Attributes.Add("onclick","return confirm('Вы уверены!');");
         }
         void OnMyButtonClick(object sender, EventArgs e) {
           _myLabel.Text="Clicked";
         }
       </script>
     </head>
     <body>
       <form runat="server">
         <asp:LinkButton runat="server" id="_myButton" OnCLick="OnMyButtonClick"
           Text="Click Me"/><br>
         <asp:Label runat="server" id="_myLabel"/>
       </form>
     </body>
    </html>
    Добавление подтверждения на кнопку в Repeater'е
    Добавление подтверждения на кнопку в DataGrid и DataList делается по аналогии.
    Код (Text):
    <%@ Page language="c#"%>
    <html>
    <head>
     <script runat="server">
      void Page_Load(object sender, EventArgs e) {
       _myList.DataSource = CreateDataSource();
       _myList.DataBind();
      }
     
      ArrayList CreateDataSource() {
       ArrayList list = new ArrayList();
       for(int i = 0; i<10; i++) {
        list.Add(string.Format("item #{0}",i));
       }
       return list;
      }
     
      void OnMyListItemCreated(object sender, RepeaterItemEventArgs e) {
       if(e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem)
       {
        LinkButton lb = (LinkButton)e.Item.FindControl("_deleteButton");
        lb.Attributes.Add("onclick","return confirm('Вы уверены!');");
       }
      }
      void OnMyListItemCommand(object sender, RepeaterCommandEventArgs e) {
       if (e.CommandName == "delete") {
        _myLabel.Text = string.Format("will be deleted row #{0}",e.CommandArgument);
       }
      }
     </script>
    </head>
    <body>
     <form runat="server">
      <asp:Repeater runat="server" id="_myList"
       OnItemCreated="OnMyListItemCreated"
       OnItemCommand="OnMyListItemCommand">
       <ItemTemplate>
        <asp:LinkButton runat="server" id="_deleteButton"
        CommandName="delete"
        CommandArgument="<%# Container.ItemIndex %>">
         Delete
        </asp:LinkButton>
       </ItemTemplate>
       <SeparatorTemplate>
        <hr>
       </SeparatorTemplate>
      </asp:Repeater>
      <hr>
      <asp:Label runat="server" id="_myLabel"/>
     </form>
    </body>
    </html>
     
  10. qDude

    qDude Гость

    Как исключить двойное нажатие на кнопку (отправку на сервер)?

    Решение 1

    Код (Text):
    <%@Page%>
    <script language=javascript><!--
    function getOb(name) {
     return document.all ? document.all.item(name) : document.getElementById(name);
    }

    function setStyleVis(name,s)
    {
     var ob = getOb(name);
     ob.style.display = (s==0)?'none':'block';
    }

    function disable(btn,txt) {
     setStyleVis(btn,0);
     setStyleVis(txt,1);
    }
    //--></script>

    <script language="C#" runat=server>
     void Page_Load( object sender, EventArgs e ) {
       btnSubmit.Attributes.Add( "onclick", "disable('" + btnSubmit.ClientID + "','submit_text');");
     }
    <script>

    <form runat=server>
     <asp:Button runat=server ID="btnSubmit" Text="Submit"/>
       <span style="font:10pt verdana;display:none;" id="submit_text">Processing,please wait...</span>
    </form>
    Решение 2

    Код (Text):
    <%@Page%>
    <script language="C#" runat=server>
     void Page_Load( object sender, EventArgs e ) {
       btnSubmit.Attributes.Add( "onclick", @"if (this.getAttribute('ac')!= 'true')
    {this.setAttribute(ac,'true');} else {return false;}");
     }
    <script>

    <form runat=server>
     <asp:Button runat=server ID="btnSubmit" Text="Submit"/>
    </form>
     
  11. qDude

    qDude Гость

    Как показать на клиенте MessageBox по нажатию на серверную кнопку?

    Код (Text):
    <%@ Page language="c#" %>
    <script runat="server">

    void OnButtonClick(object sender, EventArgs e)
    {
     Page.RegisterStartupScript("_message","<script>alert('!!!');<" + "/script>");
    }

    </script>
    <html>
    <body>
     <form runat="server">
     
      <asp:Button runat="Server" Text="Click Me!" OnClick="OnButtonClick"/>
     </form>
    </body>
    </html>
     
  12. qDude

    qDude Гость

    Как правильно работать с ASP.NET страницей в модальном диалоге?

    Работа с ASP.NET в модальном диалоге
    Когда в модальном диалоге загружается .aspx страница, то обычно любой post-back откроет новое окно с той же самой страницей. Кроме того, модальные окна кэшируются браузером и отображение динамических данных, как правило, не работает. Обе эти проблемы очень просто решаются простым добавлением следующих двух строчек внутри тэга <HEAD/> страницы:
    Код (Text):
    <HEAD>
    ...
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <base target="_self">
    ...
    </HEAD>
     
  13. qDude

    qDude Гость

    Как привязать нажатие клавиши Enter к определенной кнопке на форме?

    Ниже предлагается универсальное решение для браузеров IE и Mozilla. К одной кнопке можно привязывать лишь один контрол или область (например, таблица), нажатие Enter внутри которой вызовет "нажатие" на заданную кнопку.
    Код (Text):
    <%@ Page language="c#" AutoEventWireup="true" %>
    <script runat="server">
    void Page_Load()
    {
     RegisterControlForSubmit(txtBtnBox,btnSubmit);
     RegisterControlForSubmit(tblLinkBtnArea,btnLinkSubmit);
    }

    void RegisterControlForSubmit( Control ctrl, Control btn ) {
     string action;
     if ( btn is Button || btn is ImageButton )
      action = string.Format("\"document.getElementById('{0}').click();\"",btn.ClientID);
     else
     if ( btn is LinkButton )
      action = string.Format("\"doLinkSubmit('{0}');\"",btn.ClientID);
     else
      throw new ArgumentException("Invalid submit button type","btn");
     RegisterArrayDeclaration( "autoSubmit",action);
     RegisterArrayDeclaration( "autoSubmitNames", string.Format("\"{0}\"",ctrl.ClientID) );

     if ( !IsStartupScriptRegistered("_autoSubmit") )
      RegisterStartupScript("_autoSubmit",
       "\n<script language='javascript'><!--\n\tregisterSubmitHandlers();\n//--></sc"+"ript>");
    }

    void OnSubmitEvent( object sender, EventArgs e ) {
     lbText.Text = ((Control)sender).ID + " clicked";
    }
    </script>

    <script language=javascript><!--
    var eventKey;

    function registerSubmitHandlers() {
     if ( typeof(autoSubmitNames)!="undefined" ) {
      for( i = 0; i<autoSubmitNames.length; i++ ) {
       var ob = document.getElementById(autoSubmitNames[i]);
       if ( ob!=null )
        ob.onkeydown = doSubmit;
      }
      if ( !document.all ) {
       eventKey = "e.keyCode";
       document.captureEvents(Event.KeyDown);
      }
      else
       eventKey = "event.keyCode";
     }
    }

    function doLinkSubmit(linkID) {
     if ( document.all )
      document.getElementById(linkID).click();
     else
      document.location.href = document.getElementById(linkID).href;
    }

    function doSubmit(e) {
     if ( eval(eventKey)==13 ) {
      for( i=0; i<autoSubmitNames.length; i++ ) {
       if ( autoSubmitNames[i]==this.id ) {
        eval(autoSubmit[i]);
        return false;
       }
      }
     }
    }
    //--></script>

    <html>
    <body>
     <form runat="server">
      <asp:TextBox id="txtBtnBox" runat="server"/>
      <asp:Button id="btnSubmit" runat="server" Text="Submit" OnClick="OnSubmitEvent"/>
      <br><br>
      <table style="border:1px black solid;border-collapse:collapse;" runat="server" cellpadding=5 id="tblLinkBtnArea">
      <tr>
       <td><asp:TextBox id="txtLinkBox1" runat="server"/></td>
      </tr>
      <tr>
       <td><asp:TextBox id="txtLinkBox2" runat="server"/></td>
       <td rowspan=2 valign="center">
        <asp:LinkButton id="btnLinkSubmit" runat="server" Text="Submit" OnClick="OnSubmitEvent"/>
       </td>
      </tr>
      </table>
      <br><br>
      <asp:Label id="lbText" runat="server" EnableViewState="false"/>
     </form>
    </body>
    </html>
     
  14. Guest

    Guest Гость

    Как внедрить в DataGrid RadioButton контрол?

    Ниже приведен пример как внедрить в DataGrid RadioButton контрол.

    Код (Text):
    <%@ Page %>
    <script runat="server" language="c#">

    string _current = "";
    void Page_Load(object sender, EventArgs e) {
     if (IsPostBack) _current = "," + Request.Form["uid"].ToString() + ",";
     _grid.DataSource = new int[] {1,2,3,4,5,6,7,8,9,10};
     _grid.DataBind();
    }

    void OnSaveButtonClick(object sender, EventArgs e) {
     Response.Write(Request.Form["uid"]);
    }

    string IsChecked(int id) {
     if(_current.IndexOf("," + id.ToString() + ",") >= 0) {
      return "checked";
     } else {
      return "";
     }
    }
    </script>

    <form runat="server">
    <asp:DataGrid runat="server" id="_grid">
     <Columns>
      <asp:TemplateColumn>
       <ItemTemplate>
        <input <%#IsChecked((int) DataBinder.Eval(Container, "DataItem"))%> type="radio" name="uid" value='<%# DataBinder.Eval(Container, "DataItem")%>'>
       </ItemTemplate>
      </asp:TemplateColumn>
      <asp:TemplateColumn>
       <ItemTemplate>
        Item <%# DataBinder.Eval(Container, "DataItem")%>
       </ItemTemplate>
      </asp:TemplateColumn>
     </Columns>
    </asp:DataGrid>

    <asp:Button runat="server" Text="Save" Width="100px" onclick="OnSaveButtonClick"/>
    </form>

    Как добавить подтверждение на кнопку?

    Добавление подтверждения на отделную кнопку
    Код (Text):
    <%@ Page language="c#"%>
    <html>
    <head>
     <script runat="server">
      void Page_Load(object sender, EventArgs e) {
       _myButton.Attributes.Add("onclick","return confirm('Вы уверены!');");
      }
      void OnMyButtonClick(object sender, EventArgs e) {
       _myLabel.Text="Clicked";
      }
     </script>
    </head>
    <body>
     <form runat="server">
      <asp:LinkButton runat="server" id="_myButton" OnCLick="OnMyButtonClick"
       Text="Click Me"/><br>
      <asp:Label runat="server" id="_myLabel"/>
     </form>
    </body>
    </html>

    Добавление подтверждения на кнопку в Repeater'е
    Добавление подтверждения на кнопку в DataGrid и DataList делается по аналогии.

    Код (Text):
    <%@ Page language="c#"%>
    <html>
    <head>
     <script runat="server">
      void Page_Load(object sender, EventArgs e) {
       _myList.DataSource = CreateDataSource();
       _myList.DataBind();
      }
     
      ArrayList CreateDataSource() {
       ArrayList list = new ArrayList();
       for(int i = 0; i<10; i++) {
        list.Add(string.Format("item #{0}",i));
       }
       return list;
      }
     
      void OnMyListItemCreated(object sender, RepeaterItemEventArgs e) {
       if(e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem)
       {
        LinkButton lb = (LinkButton)e.Item.FindControl("_deleteButton");
        lb.Attributes.Add("onclick","return confirm('Вы уверены!');");
       }
      }
      void OnMyListItemCommand(object sender, RepeaterCommandEventArgs e) {
       if (e.CommandName == "delete") {
        _myLabel.Text = string.Format("will be deleted row #{0}",e.CommandArgument);
       }
      }
     </script>
    </head>
    <body>
     <form runat="server">
      <asp:Repeater runat="server" id="_myList"
       OnItemCreated="OnMyListItemCreated"
       OnItemCommand="OnMyListItemCommand">
       <ItemTemplate>
        <asp:LinkButton runat="server" id="_deleteButton"
        CommandName="delete"
        CommandArgument="<%# Container.ItemIndex %>">
         Delete
        </asp:LinkButton>
       </ItemTemplate>
       <SeparatorTemplate>
        <hr>
       </SeparatorTemplate>
      </asp:Repeater>
      <hr>
      <asp:Label runat="server" id="_myLabel"/>
     </form>
    </body>
    </html>

    Как отображать вложенные данные использую DataGrid, Repeater или DataList?

    Ниже представлен пример, каким образомо можно отображать вложенные данные при помощи элемента управления Repeater. Аналогичным образом эот можно сделать с помощью элемениов DataGrid и DataList.

    Код (Text):
    <%@ Page Language="C#" %>
    <script runat="server">
    string[] CreateMainDataSource() {
     ArrayList list = new ArrayList();
     for (int i = 0; i< 10; i++) {
      list.Add(string.Format("Родительский элемент №{0}", i));
     }
     return (string[])list.ToArray(typeof(string));
    }

    protected string[] CreateChildDataSource(int id) {
     ArrayList list = new ArrayList();
     for (int i = 0; i< 5; i++) {
      list.Add(string.Format("Дочерний элемент №{0} для {1}", i, id));
     }
     return (string[])list.ToArray(typeof(string));
    }

    void Page_Load(object sender, EventArgs e) {
     myRepeater.DataSource = CreateMainDataSource();
     myRepeater.DataBind();
    }
    </script>
    <html>
    <head>
    </head>
    <body>
    <form runat="server">
     <asp:Repeater id="myRepeater" runat="server">
      <ItemTemplate>
       <%# DataBinder.Eval(Container,"DataItem")%>
       <blockquote>
        <asp:Repeater runat="server"
         DataSource='<%# CreateChildDataSource(Container.ItemIndex) %>'>
         <ItemTemplate>
          <%# DataBinder.Eval(Container,"DataItem")%>
          <br />
         </ItemTemplate>
        </asp:Repeater>
       </blockquote>
      </ItemTemplate>
     </asp:Repeater>
    </form>
    </body>
    </html>
    Как работать с CheckBox'ом в DataGrid'е?

    Ниже представлен примеры, каким образом можно работать с CheckBox'ом в DataGrid'е.

    Код (Text):
    <%@ Page Language="C#" %>
    <script runat="server">
    public class TestInfo {
     public TestInfo(int i) {
      _i = i;
     }
     int _i;
     public int Id {
      get {
       return _i;
      }
     }
     public string Name {
      get {
       return string.Format("Элемент #{0}",_i);
      }
     }
     public bool Selected {
      get {
       return ((_i % 2) == 1);
      }
     }
    }

    TestInfo[] CreateDataSource() {
     TestInfo[] ds = new TestInfo[10];
     for(int i=0; i< 10;i++) {
      ds[i] = new TestInfo(i);
     }
     return ds;
    }

    void Page_Load(object sebder, EventArgs e) {
     if (!IsPostBack) {
      dg.DataSource = CreateDataSource();
      dg.DataKeyField = "Id";
      dg.DataBind();
     }
    }

    void OnMyButtonClick(object sender, EventArgs e) {
     System.Text.StringBuilder sb = new System.Text.StringBuilder();
     foreach(DataGridItem item in dg.Items) {
      if (item.ItemType == ListItemType.Item ||
       item.ItemType == ListItemType.AlternatingItem) {
       CheckBox cb = (CheckBox)item.FindControl("_checkBox");
       if (cb.Checked) {
        sb.AppendFormat("Элемент номер {0} выбран<br>",
         dg.DataKeys[item.ItemIndex],
         Environment.NewLine);
       }
      }
     }
     _myLabel.Text = sb.ToString();
    }
    </script>
    <form runat="server">
    <asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
     <Columns>
      <asp:TemplateColumn>
       <ItemTemplate>
        <asp:CheckBox runat="server" id="_checkBox"
         Checked='<%# DataBinder.Eval(Container.DataItem,"Selected")%>'/>
       </ItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="Name" HeaderText="Name"/>
     </Columns>
    </asp:DataGrid>
    <hr>
    <asp:Button runat="server" id="_myButton"
     Text="Проверить" OnClick="OnMyButtonClick"/>
    <hr>
    <asp:Label runat="server" id="_myLabel"/>
    </form>
    Так же можно определять изменившееся значение отдельно у каждого CheckBox'а.

    Код (Text):
    <%@ Page Language="C#" %>
    <script runat="server">
    public class TestInfo {
     public TestInfo(int i) {
      _i = i;
     }
     int _i;
     public int Id {
      get {
       return _i;
      }
     }
     public string Name {
      get {
       return string.Format("Элемент #{0}",_i);
      }
     }
     public bool Selected {
      get {
       return ((_i % 2) == 1);
      }
     }
    }

    TestInfo[] CreateDataSource() {
     TestInfo[] ds = new TestInfo[10];
     for(int i=0; i< 10;i++) {
      ds[i] = new TestInfo(i);
     }
     return ds;
    }

    void Page_Load(object sebder, EventArgs e) {
     if (!IsPostBack) {
      dg.DataSource = CreateDataSource();
      dg.DataKeyField = "Id";
      dg.DataBind();
     }
    }

    void OnStatusChecked(object sender, EventArgs e) {
     CheckBox cb = (CheckBox)sender;
     DataGridItem item = (DataGridItem)cb.Parent.Parent;
     int id = (int)dg.DataKeys[item.ItemIndex];
     _myLabel.Text = string.Format("Изменился №{0} - Текущее значение: {1}", id, cb.Checked);
    }
    </script>
    <form runat="server">
    <asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
     <Columns>
      <asp:TemplateColumn>
       <ItemTemplate>
        <asp:CheckBox runat="server" id="_checkBox" autopostback="true"
        OnCheckedChanged="OnStatusChecked"
         Checked='<%# DataBinder.Eval(Container.DataItem,"Selected")%>'/>
       </ItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="Name" HeaderText="Name"/>
     </Columns>
    </asp:DataGrid>
    <hr>
    <asp:Label runat="server" id="_myLabel"/>
    </form>
    Еще один способ получения выделенных CheckBox'ов в DataGrid'е показан ниже (по материалам топика CheckBox v DataGrid).

    Код (Text):
    <%@ Page %>
    <script runat="server" language="c#">

    string _current = "";
    void Page_Load(object sender, EventArgs e) {
     if (IsPostBack) _current = "," + Request.Form["uid"].ToString() + ",";
     _grid.DataSource = new int[] {1,2,3,4,5,6,7,8,9,10};
     _grid.DataBind();
    }

    void OnSaveButtonClick(object sender, EventArgs e) {
     Response.Write(Request.Form["uid"]);
    }

    string IsChecked(int id) {
     if(_current.IndexOf("," + id.ToString() + ",") >= 0) {
      return "checked";
     } else {
      return "";
     }
    }
    </script>

    <form runat="server">
    <asp:DataGrid runat="server" id="_grid">
     <Columns>
      <asp:TemplateColumn>
       <ItemTemplate>
        <input <%#IsChecked((int) DataBinder.Eval(Container, "DataItem"))%> type="checkbox" name="uid" value='<%# DataBinder.Eval(Container, "DataItem")%>'>
       </ItemTemplate>
      </asp:TemplateColumn>
      <asp:TemplateColumn>
       <ItemTemplate>
        Item <%# DataBinder.Eval(Container, "DataItem")%>
       </ItemTemplate>
      </asp:TemplateColumn>
     </Columns>
    </asp:DataGrid>

    <asp:Button runat="server" Text="Save" Width="100px" onclick="OnSaveButtonClick"/>
    </form>


    Как раскрасить строки DataGrid'а в зависимости от значения?
    Код (Text):
    private void MyDataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemIndex >= 0 && DataBinder.Eval(e.Item.DataItem,"daysToDeadLine") != DBNull.Value)
    {
     int DaysToDeadLine = (int)DataBinder.Eval(e.Item.DataItem,"daysToDeadLine");
     int StatusID = (int)DataBinder.Eval(e.Item.DataItem,"statusID");
     if (DaysToDeadLine <=0 && StatusID < 3)
     {
      if (e.Item.ItemIndex % 2 == 0)
       e.Item.Attributes.Add("style","background-color:pink");
      else
       e.Item.Attributes.Add("style","background-color:lightpink");

     }
    }
    }

    Как сделать двунаправленную сортировку?

    Ниже приведен пример:

    Код (Text):
    <%@ Page %>
    <%@ Import Namespace="System.Data"%>
    <html>
    <head>
     <script runat="server" language="c#">
      const string SORT_ASC = "ASC";
      const string SORT_DESC = "DESC";
      string CurrentDirection {
       get {
        object direction = ViewState["direction"];
        if (direction == null) {
         direction = ViewState["direction"] = SORT_ASC;
        }
        return (string)direction;
       }
       set {
        ViewState["direction"] = value;
       }
      }
      string CurrentField {
       get {
        object field = ViewState["field"];
        if (field == null) {
         field = ViewState["field"] = "Name";
        }
        return (string)field;
       }
       set {
        ViewState["field"] = value;
       }
      }
      DataTable CreateDataSource() {
       DataTable dt = new DataTable();
       dt.Columns.Add("Name",typeof(string));
       dt.Columns.Add("RevName",typeof(string));
       const int MAX_ITEMS = 10;
       for(int i = 0; i < MAX_ITEMS; i++) {
        DataRow dr = dt.NewRow();
        dr["Name"] = string.Concat("Item #",i);
        dr["RevName"] =
         string.Concat("Rev Item #", MAX_ITEMS - i - 1);
        dt.Rows.Add(dr);
       }
       return dt;
      }
      void Page_Load(object sender, EventArgs e) {
       if (!IsPostBack) {
        BindGrid();
       }
      }
      void OnSortGrid(object sender,
       DataGridSortCommandEventArgs e) {
       string newField = e.SortExpression;
       if (newField != CurrentField) {
        CurrentField = newField;
        CurrentDirection = SORT_ASC;
       } else {
        if (CurrentDirection == SORT_ASC) {
         CurrentDirection = SORT_DESC;
        } else {
         CurrentDirection = SORT_ASC;
        }
       }
       BindGrid();
      }
      void BindGrid() {
       DataTable dt = CreateDataSource();
       dt.DefaultView.Sort = string.Format("{0} {1}",
        CurrentField, CurrentDirection);
       _grid.DataSource = dt.DefaultView;
       _grid.DataBind();
      }
     </script>
    </head>
    <body>
     <form runat="server">
      <asp:DataGrid runat="server" id="_grid"
       AllowSorting="true" OnSortCommand="OnSortGrid"/>
     </form>
    </body>
    </html>
     
  15. qDude

    qDude Гость

    Как отключить валидацию при нажатии определенных кнопок?

    Необходимо добавить атрибут CausesValidation="false" к кнопке, при нажатии на которую нет необходимости производить валидацию (например, logout):

    Код (Text):
    <asp:Button runat="server" ID="btnLogout" CausesValidation="false" >Logout</asp:Button>


    Как отобразить картинку из Базы Данных?

    Существует несколько способов решения данного вопроса.

    Один из них – это написать отдельную .aspx страницу, для получения изображения. Получение изхображения и его вывод на экран будем производить в методе Page_Load.

    Код (Text):
    void Page_Load(object sender, EventArgs e)
    {
    //Получаем значение идентификатора картинки
    int id = Int32.Parse(Request.QueryString["ID"]);
    //Создаем подключение к БД
    using (SqlConnection myConn = new SqlConnection("server=Server;database=Images;User Id=sa;Password=asdasd;"))
    {
     //и получаем картинку по ее идентификатору
     SqlCommand myCmd = new SqlCommand("select ImageBody from Image where ImageId = @id", myConn);
     myCmd.Parameters.Add("@id", id);
     myConn.Open();
     using(SqlDataReader rdr = myCmd.ExecuteReader() )
     {
      // Проверка на существование записи
      if (rdr.Read())
       // пишем содержимое картинки клиенту.
       Response.BinaryWrite(rdr.GetSqlBinary(0).Value);
     }//DataReader уничтожен
    }//Подключение к БД закрыто
    }
    Теперь, с любой другой страницы вывести картинку с ID равным 20 можно с помощью html тэга:

    Код (Text):
    <IMG src="pic.aspx?ID=20">
    Второй способ заключается в использование HttpHandler. HttpHandler это фильтр, обрабатывающий http запросы. Любой запрос, приходящий на ASP.NET приложение, будет обработан одним из HttpHandler. Для того чтобы написать собственный HttpHandler, у класса необходимо реализовать интерфейс IHttpHandler.

    Код (Text):
    namespace ViewImage {
    public class Image : IHttpHandler
    {
    public Image()
    {  
    }
    //Свойство, указывающее на то, может ли класс вызываться без повторной инициализации
    bool IHttpHandler.IsReusable
    {
     get { return true; }
    }

    //Метод ProcessRequest, выполняющий обработку запроса
    void IHttpHandler.ProcessRequest(HttpContext context)
    {
     //Получаем значение идентификатора картинки
     int id = Int32.Parse(context.Request.QueryString["ID"]);
     //Создаем подключение к БД
     using (SqlConnection myConn = new SqlConnection("server=Server;database=Images;User Id=sa;Password=asdasd;"))
     {
      SqlCommand myCmd = new SqlCommand("select ImageBody from Image where ImageId = @id", myConn);
      myCmd.Parameters.Add("@id", id);
      myConn.Open();
      using(SqlDataReader rdr = myCmd.ExecuteReader() )
      {
       // Проверка на существование записи
       if (rdr.Read())
       // пишем содержимое картинки клиенту.
       context.Response.BinaryWrite(rdr.GetSqlBinary(0).Value);
      }}//DataReader уничтожен
     }//Подключение к БД закрыто
    }
    }
    }
    Кроме этого, необходимо зарегистрировать HttpHandler в файле web.config. Существует и другой способ, но о нем чуть ниже. Подключение HttpHandler производится при помощи параметра «httpHandlers», формат которого приведен ниже.

    Код (Text):
    <httpHandlers>
    <add verb="(verbs)" path="(путь к файлу)" type="(полное имя класса,имя сборки)" />
    </httpHandlers>

    В нашем случае запись в web.config выглядит следующим образом:

    <httpHandlers>
    <add verb="*" path="image.aspx" type="ViewImage.Image, ViewImage"/>
    </httpHandlers>
    Теперь при любом запросе файла image.aspx (реально файл не существует) обрабатывать этот запрос будет HttpHandler, код которого приведен выше. Для того чтобы вывести картинку с ID равным 13 можно использовать следующую строку:

    Код (Text):
    <img src=”image.aspx?id=13”>
    Существует еще один способ, который позволяет не регистрировать HttpHandler в web.config. Для этого необходимо создать файл с расширением ashx. Назавем его foto.ashx. Содержать же он будет всего одну строчку:

    Код (Text):
    <%@ WebHandler class="ViewImage.Image, ViewImage" %>
    Для отображения картинки с ID равным 15 при помощи данного способа, можно использовать следующую строку:

    Код (Text):
    <img src="foto.ashx?id=15">


    Как перенаправить запрос с текущей формы на другую?

    Способ №1
    Если необходимо перенаправить форму только по нажатию одной кнопки, то можно сделать так:

    Код (Text):
    <%@ Page language="c#"%>

    <script runat="server">
    void Page_Load(object sender, EventArgs e) {
     _myButton.Attributes.Add("onclick",
      "document.forms[0].setAttribute('action','page2.aspx');");
    }
    </script>

    <form runat="server">
    <asp:Button runat="server" id="_myButton" Text="Click Me"/>
    </form>
    Способ №2
    Если необходимо перенаправлять форму всегда, можно сделать как описано ниже либо воспользоваться способом №3

    Код (Text):
    <%@ Page language="c#"%>

    <script runat="server">
    void Page_Load(object sender, EventArgs e) {
     RegisterOnSubmitStatement("submit",
      "document.forms[0].setAttribute('action','page2.aspx');");
    }
    </script>

    <form runat="server">
    <asp:Button runat="server" id="_myButton" Text="Click Me"/>
    </form>
    Способ №3
    Унаследоваться от базового класса HtmlForm и переопределить метод RenderAttributes, чтобы нормально обрабатывалось свойство Action, а затем использовать данный контрол вместо стандартного.



    Как программно изменить заголовок (title) страницы?

    К сожалению, в ASP.NET нет стандартных средств для изменения заголовка странички, но это можно сделать с помощью нехитрых действий. Приведем два из них.

    1. В .aspx файле пишем следующюу конструкцию вместо старого заголовка:

    Код (Text):
     <title runat=server id=controlTitle>Title</title>
    А в Code Behind добавляем следующие конструкции:

    Код (Text):
     protected System.Web.UI.HtmlControls.HtmlGenericControl controlTitle;

    ...
    controlTitle.InnerText = "New Title";
    ...
    2. В .aspx файле пишем следующюу конструкцию вместо старого заголовка:

    Код (Text):
    <title><%=Title%></title>
    А в Code Behind добавляем следующие конструкции:

    Код (Text):
     private string _title = "Default Title";
    public string Title {
     get { return _title; }
     set { _title = value; }
    };

    ...
    this.Title = "New Title";


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

    Для этого достаточно в ответ (Response) добавить заголовок "Content-Disposition".

    Код (Text):
    Response.AddHeader("Content-Disposition", "attachment; filename=filename.txt");


    Почему у DropDownList не обрабатывается событие SelectedIndexChanged?

    Для того чтобы на сервере у DropDownList сработало событие "SelectedIndexChanged" необходимо установить атрибут "AutoPostBack" равным true.

    Примечание: Так же это относится к другим элементам управления ( TextBox, ListBox, CheckBox, RadioButton и.т.д), у которых есть серверное событие, возникающее при изменении их состония.



    При попытке выполнить SQL запрос к MS Access базе возникает ошибка " В операции должен использоваться обновляемый запрос". Что делать?

    Наиболее частая причина данной ошибки в том, что база находится на NTFS разделе и у пользователя под которым запущенно Web-приложение (обычно ASPNET) просто неет прав на изменение. То есть необходимо дать ему разрешешние на изменение файла Базы данных.



    После установки ASP.NET не отображаются web котролы, как побороть?
    Скорее всего IIS устанавливался после установки asp.net, поэтому asp.net в нем не зарегистрирован. Для того, чтоьы его зарегистрировать необходимо выполнить следующую команду:


    Код (Text):
    %windir%\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i
    После этого asp.net зарегистрируется в IIS и порблема решиться.
     
  16. Guest

    Guest Гость

    Как изменять состояние User Control'а извне?

    test.ascx
    Код (Text):
    <%@ Control language="c#" %>

    <script runat="server">
    public string Title {
     get {
      return _myLabel.Text;
     }
     set {
      _myLabel.Text = value;
     }
    }
    </script>

    <h1>
    <asp:Label runat="server" id="_myLabel"/>
    </h1>
    <hr>
    test.aspx
    Код (Text):
    <% @ Page language="c#" %>
    <% @ Register tagprefix="uc" tagname="myControl" Src="test.ascx"%>

    <script runat="server">
    void Page_Load(object sender, EventArgs e) {
     test_ascx MyControl = (test_ascx)FindControl("_myControl");
     MyControl.Title = "Some New Title!";
    }
    </script>


    <form runat="server" id="_myForm">
    <uc:myControl id="_myControl" runat="server" Title="Some Title!"/>
    Some Additional information.
    </form>


    Как найти User Control на странице?

    Для того чтобы найти Пользовательский элемент на странице достаточно воспользоваться методом FindControl текущей страницы.

    test.ascx
    Код (Text):
    <%@ Control language="c#" %>
    <h1>Sample Control</h1>
    <hr>
    test.aspx
    Код (Text):
    <% @ Page language="c#" %>
    <% @ Register tagprefix="uc" tagname="myControl" Src="test.ascx"%>

    <script runat="server">
    void OnToggleButtonClick(object sender, EventArgs e) {
     test_ascx MyControl = (test_ascx)FindControl("_myControl");
     MyControl.Visible = !MyControl.Visible;
    }
    </script>


    <form runat="server" id="_myForm">
    <uc:myControl id="_myControl" runat="server"/>
    <asp:Button runat="server" Text="Toggle User Control" OnCLick="OnToggleButtonClick"/>
    </form>
    Примечание: Если вы пользуетесь CodeBehind файлами, то для того чтобы получить доступ к статическому пользовательскому элементу управления, вам достаточно добавить protected или public поле с именем, аналогичным ID этого элемента управления и осуществлять доступ через него.



    Как определять и обрабатывать события User Control'а?

    test.ascx
    Код (Text):
    <%@ Control language="c#" %>

    <script runat="server" >

    public event EventHandler Change;

    protected void OnChange() {
     if (Change != null) {
      Change(this,new EventArgs());
     }
    }

    void OnMyButtonClick(object sender, EventArgs e) {
     OnChange();
    }

    </script>

    <h1>
    Some Information <asp:LinkButton runat="server"
     OnCLick="OnMyButtonClick">Click Me</asp:LinkButton>
    </h1>
    <hr>
    test.aspx
    Код (Text):
    <% @ Page language="c#" %>
    <% @ Register tagprefix="uc" tagname="myControl" Src="test.ascx"%>

    <script runat="server">
    void Page_Load(object sender, EventArgs e) {
     test_ascx MyControl = (test_ascx)FindControl("_myControl");
     MyControl.Change += new EventHandler(OnMyControlChange);
    }

    void OnMyControlChange(object sender, EventArgs e) {
     _myLabel.Text = "User Control Changed";
    }
    </script>


    <form runat="server" id="_myForm">
    <uc:myControl id="_myControl" runat="server"/>
    Some Additional information.<br>
    <asp:Label id="_myLabel" runat="server"/>
    </form>


    Visual Studio не открывает WebForm проект, что делать?

    Полный вопрос: Я создал WebForm приложение на локальном компьютере, но когда я пытаюсь перенести его на другую машину и открыть там с помощью Visual Studio, то возникает ошибка "Unable to open Web project 'тут имя проекта'. The file path does not correspond to the URL 'тут имя проекта'..."

    Ответ: Например, имя вашего приложения было MySite, располагался он на C:\Inetpub\wwwroot\MySite\ на локальной машине, и вы обращались к нему как

    http://localhost/MySite/

    На новой машине например вы разместили его в D:\web\MySite\.

    Чтобы можно было открывать этот проект из Visual Studio, необходимо создать в IIS виртуальную папку MySite c Local Path = D:\web\MySite\.

    Так же вы можете открыть файл Solution'а (с расширением *.sln) и поменять там строки

    http://localhost/MySite/MySite.csproj на то, что вам нужно (если, например, вы хотите сменить имя директории).



    Как в VS.NET отключить автоматическое форматирование HTML при переходе из Design View к Source View?Необходимо отключить нужные галки в меню

     
  17. qDude

    qDude Гость

    Как заставить ASP.NET обрабатывать .html файлы также как .aspx?

    Для того чтобы файлы с расширением .html обрабатывались как aspх страницы надо изменить Web.config как показано ниже

    Код (Text):
    ...
    <system.web>
    <httpHandlers>
     <add verb="GET, HEAD, POST, DEBUG" path="*.htm" type="System.Web.UI.PageHandlerFactory"/>
     <add verb="GET, HEAD, POST, DEBUG" path="*.html" type="System.Web.UI.PageHandlerFactory"/>
    </httpHandlers>

    ...


    Как обойти ошибку "A potentially dangerous Request.Form value was detected from the client"?

    Проверка правильности переданных данных появиласть в ASP.NET 1.1. По умолчанию она включена. Чтобы отключить/включить данную функцию на уровне страницы нужно изменить директиву @ Page:

    Код (Text):
    <%@ Page ... ValidateRequest="true|false" ...%>
    или через web.config для всего приложения или конкретного пути:

    Код (Text):
    <configuration>
    <system.web>
     <pages validateRequest="true|false"/>


    Как при использовании идентификации пользователей(Authentication) определить различные уровни доступа на различные страницы/папки?

    Для этого можно использовать конфигурирующий элемент location.

    Код (Text):
    <configuration>
     <location path="restricted.aspx">
      <system.web>
        <authorization>
         <allow users="?"/>
        </authorization>
      </system.web>
     </location>
     <location path="default.aspx">
      <system.web>
        <authorization>
         <allow users="*"/>
        </authorization>
      </system.web>
     </location>
    </configuration>


    Как сделать так, чтобы ASP.NET регулировала доступ к файлам с расширением, отличным от стандартного (*.htm, *.xml, *.gif и т.д.)?

    Что-бы asp.net мог регулировать доступ с файлами с нестандартными расширениями, необходимо чтобы их он их обрабатывал. Это делается следующим образом:

    1 Запустить Internet Information Services Manager
    2 Зайти в свойства Вашей виртуальной папки
    3 Нажать на кнопку "Configuration" в секции Application Settigns на вкладке Virtual Directory
    4 В открывшемся окне на вкладке Mappings добавить необходимое расширение для обработки ASP.NET (параметры можно скопировать у настройки для расширения *.aspx)
    Вот собственно и все, теперь ASP.NET будет обрабатывать Ваше расширение, и если в web.config Вы укажите ограничения по доступу, они отразятся и на Ваших файлах.



    Как увеличить максимальный размер загружаемого файла?

    За максимальный размер загружаемой информации отвечает атрибут maxRequestLength элемента httpRuntime в конфигурационном файле web.config. Его значение выражаеся в килобайтах и по умолчанию равно 4096 Кб (4 Мб).

    Код (Text):
    <configuration>
    <system.web>
     ...
     <httpRuntime maxRequestLength="10240"/>
     ...
    </system.web>
    </configuration>


    Как установить русскую культуру для страниц веб приложения?
    Необходимо добавить в конфигурационный файл

    Код (Text):
      <system.web>
       <globalization
           culture="ru-RU"
           uiCulture="ru-RU"/>

    Настройка сжатия .aspx файлов в IIS 6.0

    Включить сжатие для динамических страниц с расширением .aspx можно следующим способом:

    открыв командную консоль, выполнить следующую последовательность:

    Код (Text):
    net stop iisadmin
    cd C:\InetPub\adminscripts
    CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    net start w3svc
     
  18. qDude

    qDude Гость

    Как осуществить привязку ArrayList'а к DataGrid и отформатировать столбцы?

    Пример, который показывает, как это сделать.

    Код (Text):
    using System;
    using System.Collections;
    using System.Windows.Forms;

    namespace TestApplication
    {
    public class TestForm : System.Windows.Forms.Form
    {
     private DataGrid _booksGrid;

     public TestForm()
     {
      Text = "Test Form";
      _booksGrid = new DataGrid();
      _booksGrid.Name = "_booksGrid";
      _booksGrid.Dock = DockStyle.Fill;
      Controls.Add(_booksGrid);
      _booksGrid.DataSource = CreateBooksDataSource();
      _booksGrid.TableStyles.Add(CreateBooksStyle());
     }

     ArrayList CreateBooksDataSource()
     {
      ArrayList booksList = new ArrayList();
      for(int i = 0; i < 10; i++)
      {
       booksList.Add(new Book(i));
      }
      return booksList;
     }

     DataGridTableStyle CreateBooksStyle()
     {
      DataGridTableStyle tableStyle = new DataGridTableStyle();
      tableStyle.MappingName = "ArrayList";
      tableStyle.PreferredColumnWidth = 150;
      DataGridTextBoxColumn titleColumn = new DataGridTextBoxColumn();
      titleColumn.HeaderText = "Название";
      titleColumn.MappingName = "Title";
      tableStyle.GridColumnStyles.Add(titleColumn);
      DataGridTextBoxColumn authorColumn = new DataGridTextBoxColumn();
      authorColumn.HeaderText = "Автор";
      authorColumn.MappingName = "Author";
      tableStyle.GridColumnStyles.Add(authorColumn);
      return tableStyle;
     }

     [STAThread]
     static void Main()
     {
      Application.Run(new TestForm());
     }

    }

    public class Book
    {
     private string _title;

     public string Title
     {
      get{ return _title; }
      set{ _title = value; }
     }

     private string _author;

     public string Author
     {
      get{ return _author; }
      set{ _author = value; }
     }

     public Book(int i)
     {
      _title = "book #" + i.ToString();
      _author = "author #" + i.ToString();
     }
    }
    }


    Как сделать так, чтобы при обновлении "привязанного" объекта обновлялся DataGrid?

    Пример ниже показывает как сделать это.

    Код (Text):
    using System;
    using System.Collections;
    using System.Windows.Forms;

    namespace TestApplication
    {
    public class TestForm : System.Windows.Forms.Form
    {
     private DataGrid _booksGrid;
    ArrayList _booksList;
    Button _b;

     public TestForm()
     {
      Text = "Test Form";
      _booksGrid = new DataGrid();
      _booksGrid.Name = "_booksGrid";
      _booksGrid.Dock = DockStyle.Fill;
     
     CreateBooksDataSource();
      _booksGrid.DataSource = _booksList;
      _booksGrid.TableStyles.Add(CreateBooksStyle());
     _booksGrid.Height = 200;
     
     _b = new Button();
     _b.Text = "Add book";
     _b.Dock = DockStyle.Bottom;
     Controls.Add(_b);
     Controls.Add(_booksGrid);

     _b.Click += new EventHandler(OnButtonClick);
     }

     void OnButtonClick(object sender, EventArgs e) {
      _booksList.Add(new Book(_booksList.Count));
      CurrencyManager cm = _booksGrid.BindingContext[_booksList] as CurrencyManager;
      if (cm != null) cm.Refresh();
     }

     void CreateBooksDataSource()
     {
      _booksList = new ArrayList();
      for(int i = 0; i < 10; i++)
      {
       _booksList.Add(new Book(i));
      }
     }

     DataGridTableStyle CreateBooksStyle()
     {
      DataGridTableStyle tableStyle = new DataGridTableStyle();
      tableStyle.MappingName = "ArrayList";
      tableStyle.PreferredColumnWidth = 150;
      DataGridTextBoxColumn titleColumn = new DataGridTextBoxColumn();
      titleColumn.HeaderText = "Название";
      titleColumn.MappingName = "Title";
      tableStyle.GridColumnStyles.Add(titleColumn);
      DataGridTextBoxColumn authorColumn = new DataGridTextBoxColumn();
      authorColumn.HeaderText = "Автор";
      authorColumn.MappingName = "Author";
      tableStyle.GridColumnStyles.Add(authorColumn);
      return tableStyle;
     }

     [STAThread]
     static void Main()
     {
      Application.Run(new TestForm());
     }

    }

    public class Book
    {
     private string _title;

     public string Title
     {
      get{ return _title; }
      set{ _title = value; }
     }

     private string _author;

     public string Author
     {
      get{ return _author; }
      set{ _author = value; }
     }

     public Book(int i)
     {
      _title = "book #" + i.ToString();
      _author = "author #" + i.ToString();
     }
    }
    }
    Так же это можно сделать с помощью этого кода, но при этом собъется текущая позиция DataGrid'а.

    Код (Text):
     _booksGrid.DataSource = null;
    _booksGrid.DataSource = _booksList;

    Как активировать окно приложения, работающего в фоне?

    Если приложение выполняется в фоновом режиме, когда его основное окно перекрыто активным приложением, то активация с помощью Form.Activate не сильно поможет, поскольку название окна будет просто мигать в панеле задач. Есть еще один способ с помощью средств Windows Forms активировать окно - это использовать две строчки:

    Код (Text):
    Form.TopMost = true;
    Form.TopMost = false;
    Единственный минус - это то, что окно не получит фокус ввода.

    Ничего не остается как прибегнуть к вызову API функций. Нижеприведенная функция активирует окно и устанавливает на нем фокус:

    Код (Text):
    private void ForceActivate(Form form) {
    ForceActivate(form.Handle);
    }

    private void ForceActivate(IntPtr handle) {
    uint threadId1;
    uint threadId2;
    uint processId1;
    uint processId2;

    if (handle == GetForegroundWindow())
     return;

    threadId1 = GetWindowThreadProcessId(GetForegroundWindow(), out processId1);
    threadId2 = GetWindowThreadProcessId(handle, out processId2);

    if (threadId1 != threadId2) {
     AttachThreadInput(threadId1, threadId2, true);
     SetForegroundWindow(handle);
     AttachThreadInput(threadId1, threadId2, false);
    } else {
     SetForegroundWindow(handle);
    }

    if (IsIconic(handle))
     ShowWindow(handle, SW_RESTORE);
    else
     ShowWindow(handle, SW_SHOW);
    }

    private const int SW_SHOW = 5;
    private const int SW_RESTORE = 9;

    [DllImport("user32.dll", SetLastError=true)]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("user32.dll")]
    static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool IsIconic(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


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

    Для определения того, запущена ли еще одна копия нашей программы, воспользуемся объектом System.Threading.Mutex. Этот объект является оболочкой для системного объекта синхронизации mutex, который может существовать только в единственном экземпляре. Поэтому, если при его создании мы обнаружили, что объект уже был создан, значит, его создала предыдущая копия нашего приложения, которое еще не завершилось.

    Код (Text):
    using System;
    using System.Collections;
    using System.Threading;

    public class MyClass
    {
    private static Mutex _syncObject;
    private const string _syncObjectName = "{E663FA11-AE0D-480e-9FCA-4BE9B8CDB4E7}";

    public static void Main()
    {
    bool createdNew;
    _syncObject = new Mutex(true, _syncObjectName, out createdNew);
    if (!createdNew) {
    Console.WriteLine("Копия уже запущена.");
    return;
    }
    // Продолжаем выполнение
    Console.ReadLine();
    }
    }
     
  19. NikSoft

    NikSoft Гость

    Надо поблагодарить qDude за публикацию одной из лучших тем на форуме. Делаешь нужное и полезное дело. Почему остановился? Продолжай в том же духе.
     
  20. force_sk

    force_sk Гость

    Искренняя благодарность qDude! Действительно очень полезная тема. Лично я узнал много нового и полезного.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей