if (e.NewValues["presentation"].ToString() == "Любая")
e.NewValues["presentation"] = null;
жесткий секс с аспнет
есть там PresentationDropDownList, у которого датасорс PresentationObjectDataSource (это его наименование),
в текстовое поле идет строковая колонка Name с этого PresentationObjectDataSource
в поле данных идет колонка Id типа Guid с этого PresentationObjectDataSource
также DropDownList забиндин на основной MainObjectDataSource, на его поле presentation с типом как нетрудно догадаться Guid.
Отношения между таблицами Presentation и Main - один ко многим.
То есть при редактировании определенной строки из основного MainObjectDataSource, берется presentation из таблицы Main, для него по значению ищется нужное в PresentationDropDownList и в этом PresentationDropDownList отображается нужное имя name элемента из Presentation.
Теперь начинается жесть: мне нужно чтобы в PresentationDropDownList было также и пустое значение. Название "Любое представление", значение должно быть null, и при выборе "Любое представление" нужно записывать null в таблицу Main. Добавляю тот самый null в PresentationDropDownList в красивом окошечке свойств VS. И вот ведь незадача.
Во первых, при попытке сохранить строку из Main с выбранным "Любое представление" аспнет ругается что "" (пустая строка) не может быть преобразовано в Guid.
Этот касяк исправляется костылем, когда на методы ItemInserting и ItemUpdating объекта PresentationFormView (в нем редактирую строку из Main), добавляется код:
Код:
Во вторых: При считывании строки из Main с presentation=null опять ругань что в PresentationDropDownList не обнаружено заданное значение (оно ведь null а аспнет не могёт преобразовать null в "" для типа Guid)
с этим во вторых я имею секс до сих пор. за полдня не нашел как можно это исправить. Беда в том, что не нашел события, где PresentationDropDownList уже был бы забинден, но SelectedValue (которое null) ему еще бы не присвоилось.
И вот, значит, лирическое так скзать отступление: тимлид где то вычитал что использование Guid как первичного ключа является правильным подходом. Он человек опытный.
В аспнет DropDownList в качестве значения может содержать только строку. null типа Guid в строку и обратно автоматически не преобразуется. а может и не только типа Guid.
То есть получается что разработчики MS не реализовали этой весьма нужной фичи (преобразование пустой строки в Guid и обратно), изза отсутствия которой я полдня трахаюсь и ищу обходные пути.
Но зато у меня есть фигова куча свистелок и перделок в виде красивых мастерков настройки для выбора источника данных к ObjectDataSource и тд, что проще сделать руками или редактированием свойств. Они для каких целей вообще этот инструмент создавали? для создания индусами кучи страничек с определенным жестко заданным функционалом, без возможности добавить нестандартные фичи, которые не предусмотрели разработчики из МС?
Погуглил - не с первого раза нашел кучу тем про null в DropDownList. Но пока не одна не содержит нужного решения.
Вот код тестового класса SampleDataItem:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
/// <summary>
/// Summary description for SampleDataItem
/// </summary>
[DataObject]
public class SampleDataItem {
public SampleDataItem(Guid id, string text) {
this._id = id;
this._text = text;
}
private readonly Guid _id;
public Guid Id {
get {
return _id;
}
}
private readonly string _text;
public string Text {
get {
return _text;
}
}
[DataObjectMethod(DataObjectMethodType.Fill)]
public static SampleDataItem[] GetItems() {
SampleDataItem[] result = new SampleDataItem[10];
for (int i = 0; i < result.Length; ++i)
result = new SampleDataItem(Guid.NewGuid(), "Item " + i);
return result;
}
}
using System.Collections.Generic;
using System.ComponentModel;
/// <summary>
/// Summary description for SampleDataItem
/// </summary>
[DataObject]
public class SampleDataItem {
public SampleDataItem(Guid id, string text) {
this._id = id;
this._text = text;
}
private readonly Guid _id;
public Guid Id {
get {
return _id;
}
}
private readonly string _text;
public string Text {
get {
return _text;
}
}
[DataObjectMethod(DataObjectMethodType.Fill)]
public static SampleDataItem[] GetItems() {
SampleDataItem[] result = new SampleDataItem[10];
for (int i = 0; i < result.Length; ++i)
result = new SampleDataItem(Guid.NewGuid(), "Item " + i);
return result;
}
}
Код:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="ObjectDataSource1"
DataTextField="Text" DataValueField="Id" ondatabound="DropDownList1_DataBound" AutoPostBack="true">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetItems" TypeName="SampleDataItem"></asp:ObjectDataSource>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="ObjectDataSource1"
DataTextField="Text" DataValueField="Id" ondatabound="DropDownList1_DataBound" AutoPostBack="true">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetItems" TypeName="SampleDataItem"></asp:ObjectDataSource>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
Код:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void DropDownList1_DataBound(object sender, EventArgs e) {
ListItem default_item = new ListItem("Любое", null);
default_item.Selected = true;
DropDownList1.Items.Insert(0, default_item);
}
protected void Button1_Click(object sender, EventArgs e) {
DropDownList1.SelectedValue = null;
}
}
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void DropDownList1_DataBound(object sender, EventArgs e) {
ListItem default_item = new ListItem("Любое", null);
default_item.Selected = true;
DropDownList1.Items.Insert(0, default_item);
}
protected void Button1_Click(object sender, EventArgs e) {
DropDownList1.SelectedValue = null;
}
}
Если нажать на button1, то будет попытка выбрать элемент списка со значением null.
P.S. Может быть мы о разных контролах говорим? Не слышал о таком контроле как PresentationDropDownList в страндартной поставке ASP.NET 2.0.
PresentationDropDownList - это просто наименование объекта, из которого легко определить его класс.
Ну а вообще говоря, пост не об этом был. Пост о том, что в технологиях микрасофт куча свистелкоперделочных фич при отсутствии нормального примитивного функционала.
и,да, придвидя наезды, скажу что всё это имхо. у меня пока нет опыта с другими веб фреймворками, конечно может быть все альтернативы окажутся не менее сложными для меня. хотя сомневаюсь
Цитата: ArtemS2006
у меня значение дропдаунлиста забиндено на главный датасорс.
Сделайте примитивный пример. Не могу сообразить.
Цитата: ArtemS2006
Ну а вообще говоря, пост не об этом был. Пост о том, что в технологиях микрасофт куча свистелкоперделочных фич при отсутствии нормального примитивного функционала.
Какого? В дотнете пожалуй примитивного функционала поболее чем в ином другом языке, просто он нем нужно знать (вспоминаю свою тему про PInvoke) и уметь использовать. Привести "" (пустую строку) к Guid отказывается логика. Разве можно создать на основе такого объекта экземпляр int или double?