Прежде всего, автоматическая отправка назад не позволяет вам выбрать несколько элементов, поскольку до выбора второго элемента обратная передача уже происходит по первому выбранному элементу, поэтому
Вы должны установить AutoPostBack="false"
для своего списка,
<asp:ListBox ID="ddlstatus" runat="server" AutoPostBack="false" AppendDataBoundItems="true" SelectionMode="Multiple"></asp:ListBox>
Для сбора нескольких выбранных элементов мы просто выбираем, например, кнопку, вы можете собирать эти элементы в любом месте,
Затем добавьте одну кнопку, которая будет вызывать код ниже
<asp:Button ID="button1" runat="server" OnClick="button1_Click" Text="Click"/>
В указанном выше обработчике события кнопки добавьте следующий код:
protected void button1_Click(object sender, EventArgs e)
{
var selectedNames = ddlstatus.Items.Cast<ListItem>()
.Where(i => i.Selected)
.Select(i => i.Value)
.ToList();
string selectedValue = string.Join("','", selectedNames);
selectedValue = "'" + selectedValue + "'";
ViewState["stat"] = selectedValue;
}
Тогда разделенные запятыми элементы в вашем ViewState
будут использоваться в параметре вашей хранимой процедуры
string statusVal = null;
if (ViewState["stat"] != null && ViewState["stat"].ToString() != "0")
{
statusVal = ViewState["stat"].ToString();
}
cmd.Parameters.AddWithValue("statusVal", statusVal); //<= Now this string variable contains comma separated list box items values.
Если вы заполняете свой список в Page_Load
, убедитесь, что вы должны заполнить его в !Page.IsPostBack
, как
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//Populate your list box here
}
}
И ваш SP будет
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetTMData1`(in statusVal varchar(255))
BEGIN
IF statusVal = '\'\'' THEN
select * from approved;
ELSE
SET @sql = CONCAT('SELECT * FROM approved WHERE status IN (', statusVal, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF ;
END
Если вы выберите несколько элементовиз раскрывающегося списка данные параметров вашего SP выглядят как '\'apple\',\'banana\''
.Если нет, то это выглядит как '\''
.