Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование (VB,C#,ASP,.NET): новости, советы, примеры


Выпуск # 680

Очередной выпуск рассылки! За последнее время на сайте произошло столько всего, столько всего, что все просто не уместилось в этот выпуск! Но ничего, ведь вы всегда можете ознакомиться со всеми обновлениями непосредственно посетив сайт. Кстати, помимо изменения в содержании Kbyte.Ru, появлении новых интересных материалов, проект постоянно совершенствуется технически, и вы можете принять в этом непосредственное участие, присылая свои идеи и предложения.
Надеюсь, этот выпуск будет интересен для вас. Если вы хотите увидеть в следующих выпусках что-то конкретное, напишите мне об этом на ящик subscribe@kbyte.ru.


Содержание выпуска

Читайте в этом выпуске:

Если у вас есть вопросы по программированию или работе с компьютером, не стесняйтесь, спрашивайте.

Форумы Kbyte.Ru

На форумах Kbyte.Ru постоянно появляются новые интересные темы и обсуждения. В этом выпуске представлены лишь новые темы, с момента прошлой рассылки.

Кстати, любой желающий может на форумах Kbyte.Ru совершенно свободно получить помощь грамотных специалистов в области программирования, да и в целом информационных технологий.

Задать свой вопрос прямо сейчас

Привет. У меня есть вопрос. Я воспользовался вашей помощью насчет добавления данных из Texbox в DataGridView. Все хорошо, большое спасибо. Но вот сейчас появляеться другая ошибка. Когда я нажимаю добавить, и когда добавляю что-то в DataGridView, а также когда я сохраняю что-то иногда появляеться ошибка в Me.TableAdapterManager.UpdateAll(Me.имяDataSet1).Обновление требует действительного DeleteCommand при передаче коллекции DataRow с удаленных строк. И почему-то все работает нормально, только в этом месте всегда появляеться ошибка.Помогите пожайлуста. спасибо заранее!!!!!

[- к содержанию -]

Подскажите, пожалуйста, как мне реализовать возможность включения пользовательского контрола в состав DataTable, источником которого
является DataGridView?
Пользовательский контрол представляет класс, описывающий свойства и алгоритм "поведения" DateTimePicker".
Например, включить его в состав коллекции колонок DGV - не вижу препятствий, в состав dt - не представляю как выкрутиться.

Whith dgv
Dim cellPhoto As New DataGridViewImageColumn()
calendar = New CalendarColumn()'Тот самый пользовательский контрол
Dim name As New DataGridViewTextBoxColumn()
Dim note As New DataGridViewTextBoxColumn()
cellPhoto.Name = "Фото"
calendar.Name = "Дата"
name.Name = "Имя"
note.Name = "Заметка"
.Columns.Add(cellPhoto)
.Columns.Add(calendar)
.Columns.Add(name)
.Columns.Add(note)
cellPhoto.Width = 250
calendar.Width = 220
note.Width = 250
name.Width = 250
cellPhoto.ImageLayout = DataGridViewImageCellLayout.Normal
.RowHeadersDefaultCellStyle.BackColor = Color.Blue
End Whith

[- к содержанию -]

Ответ #1 @Aleksey Nemiro 13.03.2012 14:52
...включения пользовательского контрола в состав DataTable, источником которого является DataGridView?
У DataTable не может быть источника, он сам источник.
DataTable не является элементом управления, не прорисовывается, и не принадлежит Windows Forms. Класс DataTable может использоваться во всех других технологиях, базирующихся на .NET: ASP .NET, WPF, Silverlight, и т.п.

Сделать так, чтобы в DataTable был календарь, который потом волшебным образом сам прорисовывался в DataGridView - невозможно.

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

[- к содержанию -]

Ответ #2 @Scryaga 13.03.2012 15:50
Спасибо, Алексей! Я был не прав.

[- к содержанию -]

Добавить свой ответ в эту тему
Здравствуйте, я создаю личный блог на asp.net используя webforms model (не MVC) и у меня возникала загвоздка с передачей параметра через URL path. Задача в общих словах: страница блога (blog-main.aspx) содержит превьюхи постов (тизеры). Тизер стандартный: заголовок, дата, картинка, текст тизера, под ним- "читать далее..." Заголовок, картинка и "читать далее" представлены в виде ссылок на основную статью.
Как я понимаю надо использовать '?id= c первичным ключом таблицы в свойствах PostBackUrl и NavigateUrl.

Текст Presentation Page:
<asp:Content ID="Content2" ContentPlaceHolderID="cphEntry" Runat="Server">
	<asp:Repeater ID="rptMain" runat="server" >
       <ItemTemplate>
        <div class="post no-bg">
		    <h3><asp:LinkButton ID="lbTeaserTitle" runat="server" text='<%#Eval("Title")%>' PostBackUrl='~/blog-post.aspx' CommandArgument='<%#Eval("EntryID")%>' /></h3>
			    <asp:Label ID="lblCreated" runat="server" Text='<%#Eval("Created")%> ' CssClass="post-info" />
                  <p>
                    <asp:HyperLink ID="hplTeaserPic" runat="server" ImageUrl='<%#Eval("TeaserPic")%>' NavigateUrl='~/blog-post.aspx' CssClass="float-left" />                    
					<asp:Label ID="lblTeaserText" runat="server" Text='<%#Eval("TeaserTXT")%>' />
                  </p>
                   <p>
					<asp:LinkButton ID="lbTeaserRead" runat="server" text="ReadMore" PostBackUrl='~/blog-post.aspx' CommandArgument='<%#Eval("EntryID")%>' />
				 </p>
        </div>		
		    </ItemTemplate>
    </asp:Repeater>
</asp:Content>

где blog-post.aspx это страница основной статьи

Code Behind Page:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class blog_main : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataClassesDataContext _objNewDC = new DataClassesDataContext();
        using (_objNewDC)
        {
            var allTeasers = _objNewDC.Blog_entries.Select(x => x);
            rptMain.DataSource = allTeasers;
            rptMain.DataBind();
        }
    }
}

В решении использую и LINQ и одну таблицу MSsql для постов.
EntryID это primary key именно его и хочу передать в качестве параметра в url. на страницу главного поста - blog-post.aspx. На ней же разместить asp контролы для вывода самой статьи на основании переданного параметра EntryID.

Уважаемые разработчики, подскажите пожалуйста как это сделать.

[- к содержанию -]

Ответ #1 @Aleksey Nemiro 12.03.2012 14:27
Вопрос до конца не понял, но если проблема в том, чтобы добавит параметр к url, то сделать это можно так:

<asp:HyperLink ID="hplTeaserPic" runat="server" ImageUrl='<%#Eval("TeaserPic")%>'
NavigateUrl='<%#String.Format("~/blog-post.aspx?id={0}", Eval("id"))%>' CssClass="float-left" />

Еще можно добавить обработчик ItemDataBound к Repeater и в нем, через FindControll, искать нужные элементы и изменять их. Например:
protected void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
  if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;
  ((HyperLink)e.Item.FindControl("hplTeaserPic")).NavigateUrl += "?id=" + e.Item.DataItem["id"].ToString();
}


LinkButton - лучше не использовать, т.к. они делают postback. В плане поисковой оптимизации (SEO) это будет плохо, да и для пользователей неудобно.

[- к содержанию -]

Ответ #2 @fareastaz 13.03.2012 03:20
Алексей огромное вам спасибо! Я в ASP.Net новичек, поэтому возникают много вопросов. Скажите а для чего в этой строчке передавать 0 в фигурные скобки "~/blog-post.aspx?id={0}", Eval("id"))%>' , это что-то вроде создание массива? Сделал по первому способу добавив на страницу основного поста след код перехвата id (не слишком ли мудреный способ?):

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            _PageRebind();
    }



    /*=================
         * Private Functions
         * ==============*/

    private void _PageRebind()
    {
        LinqClass _linq = new LinqClass();
        if (Request.QueryString["id"] != null)
        {
            string id = Request.QueryString["id"] as String;

            rptPost.DataSource = _linq.GetPostByID(int.Parse(id));
            rptPost.DataBind();
        }
        
        
    }

Еще есть вопрос по поводу репитера на основной странице поста (на ту куда ведет ссылка со страницы тизера). Я использовал для отображения записи поста элемент asp:Repeater, но если логически подумать, репитер обычно используется для отображения записей из таблицы которые повторяются (к примеру список тизеров, категории итд) но на самой страницы поста он же в принципе не нужен так как на страница поста выводит только один пост согласно переданному id. Так вот каким образом можно избавиться от репитера и передать значения полей из базы данных напрямую в Лейблы? Или репитер это единственный способ?

Для отображения страницы поста использую следующий код:

<asp:Content ID="post" ContentPlaceHolderID="cphEntry" Runat="Server">

		<asp:Repeater ID="rptPost" runat="server">
        <ItemTemplate>
            <div class="post no-bg">
                <h3><asp:Label ID="lblTitle" runat="server" Text='<%#Eval("Title")%>' /></h3>
			        <asp:Label ID="lblCreated" runat="server" Text='<%#Eval("Created")%> ' CssClass="post-info" />
				    <asp:Label ID="lblPost" runat="server" Text='<%#Eval("FullText")%>' />
          </div>          
        </ItemTemplate>
         
        </asp:Repeater>
      
</asp:Content>



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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class LinqClass
{

    DataClassesDataContext _objNewDC = new DataClassesDataContext();


   
    public IQueryable<Blog_page> GetPageByID(int _id)
    {
        var allpages = _objNewDC.Blog_pages.Where(x => x.PageID == _id).Select(x => x);
        return allpages;
    }

    public IQueryable<Blog_entry> GetPostByID(int _id)
    {
        var post = _objNewDC.Blog_entries.Where(x => x.EntryID == _id).Select(x => x);
        return post;
    }


}


[- к содержанию -]

Ответ #3 @Aleksey Nemiro 13.03.2012 10:56
Скажите а для чего в этой строчке передавать 0 в фигурные скобки "~/blog-post.aspx?id={0}", Eval("id"))%>' , это что-то вроде создание массива?
это для функции String.Format, которая принимает следующие параметры:
format - строка с указанием формата вывода;
args - массив аргументов.

Фигурные скобки, указанные в строке (format) будут заменены на значения args. Количество фигурных скобок в строке должно соответствовать количеству параметров (args). Отсчет начинается с нуля.

В данном случае
String.Format("~/blog-post.aspx?id={0}",
Eval("id"))
параметр один.
{0} будет заменен на Eval("id").
Сделал по первому способу добавив на страницу основного поста след код перехвата id (не слишком ли мудреный способ?)
Можно проще:
int id = 0;
if(int.TryParse(Request.QueryString["id"], out id) && id > 0)
{
 rptPost.DataSource = _linq.GetPostByID(id);
 rptPost.DataBind();
}
Так вот каким образом можно избавиться от репитера и передать значения полей из базы данных напрямую в Лейблы?
Получать из IQueryable<Blog_entry>, в зависимости от структуры этого класса/коллекции. Можно посмотреть в режиме отладки, из чего он сделан и какие данные содержит. Вот тут показано, как во время отладки просматривать переменные/объекты в Visual Studio.

LINQ практически не пользуюсь, разбираться нет времени, так что ничего не скажу.
Или репитер это единственный способ?
Его для таких целей обычно не используют.

[- к содержанию -]

Ответ #4 @fareastaz 13.03.2012 15:09
Благодарю за подробное объяснение!

[- к содержанию -]

Добавить свой ответ в эту тему
Корпорация из США (Сан Хосе, Силиконовая долина) расширяет три бизнес-проекта.

Расширение производится на территории Европы и в странах бывшего СССР.

Требуются толковые программисты (ASP, PHP) с административным мышлением.

В процессе работы возможны коммандировки и стажировки в головной организации в США с последующим предоставлением визы L-1 (внутрикорпоративный перевод) для постоянного проживания в США.

Контакт через Skype: ok4733

С уважением, Людмила (официальный представитель корпорации).

[- к содержанию -]

DataGridView @rusiko 09.03.2012 22:11
Привет. Я постараюсь быть короче и понятнее. Как сделать так чтоб когда в TextBox пишется число, то после нажатия на Button это число отражалось в одном из полей DataGridView в Visual Basic 2010. БД на SQL. Спасибо

[- к содержанию -]

Ответ #1 @Aleksey Nemiro 10.03.2012 11:11
Я постараюсь быть короче и понятнее.
Краткость не всегда хороша. У меня миллион ответов на этот вопрос, а время есть только на пару из них.

DataGridView не обязательно должен быть связан с базой или другим источником данных, это обычный, самодостаточный, элемент управления.

Добавить в DataGridView введенные в TextBox данные можно так:
  Private Sub Form1_Load(sender As System.Object,
e As System.EventArgs) Handles MyBase.Load
    'создать новую колонку
    DataGridView1.Columns.Add(New DataGridViewTextBoxColumn() With {.HeaderText = "число"})
  End Sub

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'добавить строку из TextBox1.Text в DataGridView
    DataGridView1.Rows.Add(TextBox1.Text)
    TextBox1.Text = ""
  End Sub
Изменить:
  Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    'добавляем колонку
    DataGridView1.Columns.Add(New DataGridViewTextBoxColumn() With {.HeaderText = "число"})
    'добавляем несколько строк
    Dim r As New Random(Date.Now.Millisecond)
    For i As Integer = 1 To 5
      DataGridView1.Rows.Add(r.Next(0, 1000).ToString())
    Next
  End Sub

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    If DataGridView1.CurrentCell Is Nothing Then
      MsgBox("Выберите ячейку!")
    End If
    'меняем в выбранной ячейке значение, на указанное в текстовом поле
    DataGridView1.CurrentCell.Value = TextBox1.Text
    TextBox1.Text = ""
  End Sub

Что касается работы с базой, то это отдельная тема. Обновление базы, на основе последнего примера, может выглядеть так:
  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    If DataGridView1.CurrentCell Is Nothing Then
      MsgBox("Выберите ячейку!")
    End If
    'меняем в выбранной ячейке значение, на указанное в текстовом поле
    DataGridView1.CurrentCell.Value = TextBox1.Text
    TextBox1.Text = ""

    'обновить данные в базе
    Using myConn As New SqlConnection("строка соединения с базой данных SQL Server")
      myConn.Open()
      Dim myCmd As New SqlCommand("UPDATE [таблица] SET [поле] = @field WHERE [идентификатор] = @id", myConn)'запрос нужно указывать свой, на основе структуры таблицы бд
      myCmd.Parameters.Add("@field", SqlDbType.Float).Value = CType(TextBox1.Text, Double) 'число
      myCmd.Parameters.Add("@id", SqlDbType.Int).Value = 1 'уникальный числовой идентификатор строки данных
      myCmd.ExecuteNonQuery()
    End Using
  End Sub

[- к содержанию -]

Добавить свой ответ в эту тему

Все темы и обсуждения

Исходные коды

WPF List Images

Visual Basic .NET: Графика @Shark1 15.03.2012 02:47
Пример загрузки изображений в элемент ListBox
с отображением выделенного изображения в элементе Label.

К данном исходному коду прилагаются файлы примеров. Скачать.

[- к содержанию -]

RSS Feed

Visual Basic .NET: Готовые решения @[i]Pro 09.03.2012 23:21
Простенькая RSS читалка, написана с использованием .NET Framework 4 и дополнительной библиотекой xNet для загрузки и парсинга RSS ленты.
Imports xNet.Text.StringHelper
Imports System.Text
Imports System.Net

Public Class Feed
  Public URL As String
  Public RSS(500) As RSSFeed

  Dim Links() As String
  Dim Titles() As String
  Dim Description() As String

  Public Structure RSSFeed
    Dim URL As String
    Dim Title As String
    Dim Description As String
  End Structure

  Public Sub SubStr(ByVal source As String)
    Links = source.Substrings("<link>", "</link>")
    Titles = source.Substrings("<title>", "</title>")
    'Description = source.Substrings("<description>", "</description>")
  End Sub

  Public Function GetSource()
    Return xNet.Net.HttpClient.GetText(URL)
  End Function

  Public Sub Sort()
    For i = 0 To Links.Length - 1
      RSS(i).URL = Links(i)
      RSS(i).Title = Titles(i)
      'RSS(i).Description = Description(i)
    Next
  End Sub
End Class

К данном исходному коду прилагаются файлы примеров. Скачать.

[- к содержанию -]

Все исходные коды

Вакансии в IT

Разработчик баз данных

Россия, Москва | Работа в офисе | 80 000.00 RUB

HTML5 разработчик

Россия, Москва | Работа в офисе | 50 000.00 RUB

Разработчик . NET

Россия, Москва | Работа в офисе

Программист

Россия, Москва | Работа в офисе | 35 000.00 RUB

Программист

Россия, Москва | Работа в офисе | 70 000.00 RUB

Программист Delphi

Россия, Москва | Работа в офисе

Программист

Россия, Москва | Работа в офисе | 3 000.00 USD

Программист приложения Апстор

Россия, Москва | Работа в офисе

Ведущий программист, руководитель проектов

Россия, Москва | Работа в офисе | 90 000.00 RUB

Программист

Россия, Москва | Работа в офисе | 60 000.00 RUB

Все вакансии в IT · Создать резюме

[- к содержанию -]

Новости мира IT

В Microsoft говорят о создании сверхскоростного сенсорного дисплея

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

В Microsoft Applied Science Group говорят, что создали прототип экрана, который имеет минимальную задержку реакции на прикосновение пользователя - всего около одной миллисекунды. На практике такая задержка не заметна для пользователей и открывает новые сферы применения планшетов и сенсорных устройств.

15.03.2012 11:28 · Категория: Железо · Источник: CyberSecurity.ru

[- к содержанию -]

Анонсирован Android-смартфон за 2800 евро

Швейцарский производитель часов TAG Heuer представил смартфон Racer ценой в 2800 евро. Аппарат поступит в продажу в июне. Корпус устройства изготовлен из резины, углеродного волокна и титана. Racer работает на базе Android, но ни одной технической характеристики аппарата TAG Heuer пока не называет.

15.03.2012 11:26 · Категория: Железо · Источник: Lenta.ru

[- к содержанию -]

Новый троянец-блокировщик вымогает у пользователей платные SMS

Компания «Доктор Веб» предупредила о появлении нового троянца-блокировщика Trojan.Winlock.5729. Особенность этой программы-вымогателя заключается в том, что она блокирует операционную систему, используя штатные средства Windows, путем изменения пароля локальных пользователей.

Традиционно программы-вымогатели используют для блокировки входа в операционную систему специальное приложение, заменяющее собой стандартную оболочку (shell) Windows или файл userinit.exe и демонстрирующее на экране компьютера соответствующий текст. Одновременно вредоносная программа обычно отслеживает и предотвращает запуск различных вспомогательных утилит, таких как Диспетчер задач, Командная строка, Редактор реестра и т. д. Совершенно по иному, гораздо более простому, но весьма оригинальному пути пошли авторы Trojan.Winlock.5729. 

Троянец скрывается в установочном дистрибутиве популярной программы Artmoney, предназначенной для «накрутки» различных ресурсов в компьютерных играх. Помимо реального установщика Artmoney, инсталлятор содержит три файла: измененный файл logonui.exe с именем iogonui.exe (этот файл отвечает за демонстрацию графического интерфейса при входе пользователя в Windows XP) и два самораспаковывающихся архива, содержащих bat-файлы. При загрузке инфицированного инсталлятора запускается первый из них, password_on.bat.

Данный файл содержит набор команд, выполняющих проверку операционной системы: если на жестком диске присутствует папка c:\users\, что является характерным признаком операционной системы Windows Vista и Windows 7, вредоносные компоненты удаляются, если же такая папка отсутствует, троянец считает, что он запущен в Windows XP. В этом случае Trojan.Winlock.5729 модифицирует системный реестр, подменяя при загрузке Windows стандартный logonui.exe собственным файлом iogonui.exe, и меняет пароль учетной записи Windows для текущего пользователя и локальных пользователей с именами «admin», «administrator», «админ», «администратор». Если текущий пользователь работает в ограниченной учетной записи, работа троянца прекращается. Еще один bat-файл — password_off.bat — удаляет все пароли и возвращает в системном реестре оригинальное значение UIHost.

Файл iogonui.exe представляет собой настоящий аутентичный файл logonui.exe из комплекта поставки Windows XP, в котором с помощью редактора ресурсов была изменена стандартная строка приветствия Windows на требование отправить платное СМС-сообщение.

Таким образом, выполнив выход из системы или перезагрузку, пользователь уже не сможет осуществить вход, поскольку пароли всех учетных записей пользователей были изменены.

15.03.2012 11:26 · Категория: Безопасность · Источник: CyberSecurity.ru

[- к содержанию -]

Все новости


Подпишитесь на тематические RSS-ленты Kbyte.Ru, чтобы быть в курсе последних новостей:

Основная лента · Форумы (темы и сообщения) · Visual Basic 5.0/6.0 · Visual Basic .NET · C# (Си шарп) · Delphi · JavaScript · ActionScript · ASP .NET · ASP .NET MVC

Ищите Kbyte.Ru в социальных сетях FaceBook, ВКонтакте, Twitter.

Если вы занимаетесь программированием, то наверняка вам пригодятся хитрые инструменты.


Международный портал для программистов и разработчиков Kbyte.Ru основан в 2006 году. Целью портала является объединение программистов и специалистов IT-бизнеса, студентов и преподавателей для обмена опытом и знаниями, оказания помощи во всех делах и начинаниях в области IT.
Kbyte.Ru является парнёром компаний Mail.Ru Group, WebMoney Transfer, Ozon.Ru и др.
Выпуск рассылки подготовлен автоматически. Все права на материалы выпуска принадлежат Kbyte.Ru если иное не указано отдельно.


В избранное