Ответ Vexe работал лучше всего для меня, но мне пришлось изменить его, чтобы исправить пару проблем. Это решение выделит правильный объект, если один и тот же объект находится в списке несколько раз. Кроме того, это решение предотвращает переворот нескольких выбранных объектов, когда они попадают в верхнюю или нижнюю часть списка, а кнопка продолжает нажиматься несколько раз.
private void btnMoveUp_Click(object sender, EventArgs e)
{
// find the lowest index of non selected items
int lowestIndexNotSelected = listBox.Items.Count - 1;
for (int i = listBox.Items.Count - 1; i >= 0; i--)
{
if (!listBox.SelectedIndices.Contains(i))
{
lowestIndexNotSelected = i;
}
}
listBox.BeginUpdate();
int numberOfSelectedItems = listBox.SelectedItems.Count;
for (int i = 0; i < numberOfSelectedItems; i++)
{
// only if it's not a lower inde than the lowest non selected index
if (listBox.SelectedIndices[i] > lowestIndexNotSelected)
{
// the index of the item above the item that we wanna move up
int indexToInsertIn = listBox.SelectedIndices[i] - 1;
// insert UP the item that we want to move up
listBox.Items.Insert(indexToInsertIn, listBox.SelectedItems[i]);
// removing it from its old place
listBox.Items.RemoveAt(indexToInsertIn + 2);
// highlighting it in its new place (by index, to prevent highlighting wrong instance)
listBox.SelectedIndex = indexToInsertIn;
}
}
listBox.EndUpdate();
}
private void btnMoveDown_Click(object sender, EventArgs e)
{
// find the highest index of non selected items
int highestIndexNonSelected = 0;
for (int i = 0; i < listBox.Items.Count; i++)
{
if (!listBox.SelectedIndices.Contains(i))
{
highestIndexNonSelected = i;
}
}
listBox.BeginUpdate();
int numberOfSelectedItems = listBox.SelectedItems.Count;
// when going down, instead of moving through the selected items from top to bottom
// we'll go from bottom to top, it's easier to handle this way.
for (int i = numberOfSelectedItems - 1; i >= 0; i--)
{
// only if it's not a higher index than the highest index not selected
if (listBox.SelectedIndices[i] < highestIndexNonSelected)
{
// the index of the item that is currently below the selected item
int indexToInsertIn = listBox.SelectedIndices[i] + 2;
// insert DOWN the item that we want to move down
listBox.Items.Insert(indexToInsertIn, listBox.SelectedItems[i]);
// removing it from its old place
listBox.Items.RemoveAt(indexToInsertIn - 2);
// highlighting it in its new place (by index, to prevent highlighting wrong instance)
listBox.SelectedIndex = indexToInsertIn - 1;
}
}
listBox.EndUpdate();
}
Похоже, вам нужно указать json в качестве формата ответа в теге scriptMethod. Это с vb.net, но я уверен, что вы уловили идею:
ResponseFormat: = ResponseFormat.Json
не уверен, может ли это быть так просто, но я использую jQuery для обратного вызова JSON из моих веб-методов.
основное отличие, которое я вижу, - это атрибут класса
[System.Web.Script.Services.ScriptService]
[WebService(Namespace = "http://MyNameSpace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class Web : System.Web.Services.WebService{
[WebMethod]
public string TestMethod(){
return "Testing";
}
}
Я должен предположить, что вы используете фреймворк 3.5, потому что это единственный способ раскрыть веб-методы JSON.
Мои вызовы из jQuery выглядят практически одинаково, поэтому проблем нет.
Если вы тестируете это в IE, попробуйте удалить объявление кодировки из вашего атрибута contentType (т.е. оно должно выглядеть следующим образом:
contentType: "application/json",
Мне еще предстоит выяснить, почему, но IE, похоже, не совсем прав при выполнении вызовов JSON с " charset = UTF -8
"часть.
Я думаю, вы ищете атрибут WebInvoke или WebGet, он позволяет вам указать шаблон Uri, стиль тела, форматы запроса и ответа, например:
[WebGet(ResponseFormat= WebMessageFormat.Json)]
Эта ссылка может помочь . Есть аналогичная статья для WebInvoke (используется в основном для сообщений).
Я довольно часто использую вызовы JQuery AJAX JSON для веб-службы ASMX. Он отлично работает во всех браузерах. Я использую .NET 2.0 с установленными расширениями ASP.NET AJAX (в комплекте 3.5).
Мой класс имеет те же декораторы, что и ваш. Мои методы имеют только декоратор [WebMethod (EnableSession = true)]
. Однако мой web.config имеет следующую запись в разделе httpHandlers:
<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Мой вызов jquery выглядит следующим образом:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "path/to/service/jsonservice.asmx/MethodName",
data: JSON.stringify(DTO),
dataType: "json",
success: function(rtrn) { alert("good"); },
error: function(req, msg, err) { alert("bad"); }
});
Эта статья является корнем моих знаний.
У меня это работает в версии 2.0 с использованием веб-служб, но я установил защиту от .d (см. DataFilter ниже). Я также возвращаю массив объектов. ПРИМЕЧАНИЕ: класс объекта статический, иначе он не работал бы у меня, по крайней мере.
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
dataFilter: function(data)
{
var msg;
if (typeof (JSON) !== 'undefined' &&
typeof (JSON.parse) === 'function')
msg = JSON.parse(data);
else
msg = eval('(' + data + ')');
if (msg.hasOwnProperty('d'))
return msg.d;
else
return msg;
},
url: "webservice/ModifierCodesService.asmx/GetModifierList",
success: function(msg)
{
LoadModifiers(msg);
},
failure: function(msg)
{
$("#Result").text("Modifiers did not load");
}
});
Вот фрагмент моей веб-службы:
...
[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{
/// <summary>
/// Get a list of Modifiers
/// </summary>
/// <returns></returns>
[WebMethod(EnableSession = true)]
public Modifier[] GetModifierList()
{
return GetModifiers();
}
/// <summary>
/// Modifiers list from database
/// </summary>
/// <returns></returns>
private Modifier[] GetModifiers()
{
List<Modifier> modifier = new List<Modifier>();
ModifierCollection matchingModifiers = ModifierList.GetModifierList();
foreach (Modifier ModifierRow in matchingModifiers)
{
modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
}
return modifier.ToArray();
}
}
...
объект код:
public static class ModifierList
{
/// <summary>
/// Returns the Modifier Collection.
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
public static ModifierCollection GetModifierList()
{
Сегодня я боролся с этим, когда приложение для iPhone взаимодействовало с веб-службой .Net.
Я обнаружил, что если я изменил свой Content Type на application / jsonrequest, все прошло без проблем, и я смог обработать данные на моем веб-сервере.
Просто для усмешки я добавил упомянутую выше строку в свой web.config, но она не заставила application / json работать.