Установите первое значение как NULL в DropDownMenu C# - PullRequest
1 голос
/ 18 июня 2020

Когда я запускаю приложение, значение раскрывающегося меню всегда устанавливается на 0 и отображается результат в Report.

Я хочу изменить их, чтобы добавить text в DropDownMenu и когда пользователь ничего не выбирает он должен возвращать все данные, если пользователь выбирает значение из раскрывающегося списка, он должен возвращать значение, выбранное пользователем.

Первое раскрывающееся меню

public void FillOrgUnit()
{
            using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True"))
            {
                string com = "SELECT DISTINCT OrgUnitID FROM tblZaposleni_AD ORDER BY OrgUnitID ASC";
                SqlDataAdapter adpt = new SqlDataAdapter(com, conn);
                DataTable dt = new DataTable();
                adpt.Fill(dt);
                ddlOrgUnit.DataSource = dt;
                ddlOrgUnit.DataTextField = "OrgUnitID";
                ddlOrgUnit.DataValueField = "OrgUnitID";
                ddlOrgUnit.DataBind();

                ddlOrgUnit.Items.Insert(0, new ListItem("-- Izaberi Org Jedinicu --", "NULL"));
            }
}

Второе раскрывающееся меню:

public void FillStatus()
{
        using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True"))
        {
            string com = "SELECT DISTINCT Status FROM tblZaposleni_AD";
            SqlDataAdapter adpt = new SqlDataAdapter(com, conn);
            DataTable dt = new DataTable();
            adpt.Fill(dt);
            ddlStatus.DataSource = dt;
            ddlStatus.DataTextField = "Status";
            ddlStatus.DataValueField = "Status";
            ddlStatus.DataBind();

            ddlStatus.Items.Insert(0, new ListItem("-- Izaberi Status --", "NULL"));
        }
}

введите здесь описание изображения

HTML

 <div>
            <p class="auto-style1">
                Izaberi Izvjestaj :
                <br class="auto-style1" />
                <asp:DropDownList ID="ddlReportName" runat="server" Width="168px" DataTextField="Value" DataValueField="Key" OnSelectedIndexChanged="ddlReportName_SelectedIndexChanged" Height="16px">
                </asp:DropDownList>
                <br class="auto-style1" />
                Org Unit
                <br class="auto-style1" />
                <asp:DropDownList ID="ddlOrgUnit" runat="server" Height="17px" OnSelectedIndexChanged="ddlOrgUnit_SelectedIndexChanged" Width="157px" AppendDataBoundItems="True">                
                <asp:ListItem Value="">-- Izaberi Org Jedinicu --</asp:ListItem>
                </asp:DropDownList>
                &nbsp;
                <br class="auto-style1" />
                Status:
                <br class="auto-style1" />
                <asp:DropDownList ID="ddlStatus" runat="server"  Height="16px" OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged1" Width="147px" AppendDataBoundItems="True">               
                <asp:ListItem Value="">-- Izaberi Status --</asp:ListItem>
                </asp:DropDownList>
                &nbsp;
            </p>
            <p class="auto-style1">
                <br class="auto-style1" />
                <%--<a href="javascript:ShowReport()">Show</a>--%>
                <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Filter" Width="224px" />

            </p>
        </div>

Page_Load где я звоню FillStatus и FillOrgUnt метод

protected void Page_Load(object sender, EventArgs e)
{
            if (!IsPostBack)
            {
                string path = @"\Reports\";
                CustomReportStorageWebExtension reportsStorage = new CustomReportStorageWebExtension(path);
                ddlReportName.DataSource = reportsStorage.GetUrls();
                ddlReportName.DataBind();

                //Call function for populate cb
                FillStatus();
                FillOrgUnit();
            }
            else
            {
                XtraReport reportToOpen = null;

                switch (ddlReportName.SelectedValue)
                {
                    case "Zaposleni 1":
                        reportToOpen = new ZaposleniSaoOsig1();
                        break;

                    case "Zaposleni 2":
                        reportToOpen = new ZaposleniSaoOsig2();
                        break;

                    case "Zaposleni 3":
                        reportToOpen = new ZaposleniSaoOsig3();
                        break;
                }

                GetReports(reportToOpen);
                ASPxWebDocumentViewer1.OpenReport(reportToOpen);
            }
        }

Основная функция, которая фильтрует Status и OrgUnit

private void GetReports(XtraReport report)
{
            try
            {
                string connString = @"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True";
                SqlConnection conn = new SqlConnection(connString);
                string strproc = "TestReport";
                using (SqlDataAdapter sda = new SqlDataAdapter(strproc, connString))
                {
                    DataSet ds = new DataSet();
                    SqlCommand cmd = new SqlCommand();
                    sda.SelectCommand.CommandType = CommandType.StoredProcedure;

                    sda.SelectCommand.Parameters.Add("@Status", SqlDbType.Bit).Value = ddlStatus.SelectedValue == "1" ? true : false;
                    sda.SelectCommand.Parameters.Add("@OrgJed", SqlDbType.Int).Value = ddlOrgUnit.SelectedValue;
                    sda.Fill(ds);

                    string[] arrvalues = new string[ds.Tables[0].Rows.Count];

                    for (int loopcounter = 0; loopcounter < ds.Tables[0].Rows.Count; loopcounter++)
                    {
                        //assign dataset values to array
                        arrvalues[loopcounter] = ds.Tables[0].Rows[loopcounter]["PrezimeIme"].ToString();
                        arrvalues[loopcounter] = ds.Tables[0].Rows[loopcounter]["NetworkLogin"].ToString();
                        arrvalues[loopcounter] = ds.Tables[0].Rows[loopcounter]["Status"].ToString();
                        arrvalues[loopcounter] = ds.Tables[0].Rows[loopcounter]["OrgUnitID"].ToString();
                    }


                    report.DataSource = ds;
                    report.DataMember = ds.Tables[0].TableName.ToString();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

А также хранимую процедуру, которая возвращает отфильтрованный отчет по Status или OrgId

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[TestReport]
(           
    @Status bit,
    @OrgJed int
) 
AS  
BEGIN
    SELECT PrezimeIme, NetworkLogin, Status, OrgUnitId, DT_Creat, DT_Modif
    FROM [DesignSaoOsig1].[dbo].[tblZaposleni_AD]
    WHERE (@Status IS NULL OR Status = @Status) 
      AND (@OrgJed IS NULL OR OrgUnitID = @OrgJed)
END

Ответы [ 2 ]

0 голосов
/ 18 июня 2020
using(sqlconnection con=new sqlconnection(cs))
{
   sqlcommand cmd=new sqlcommand("select [datatextfield], [datavaluefield] from tbl",con);
   sqldatareader rdr=cmd.executereader();
   dropdown.datasource=rdr;
   dropdown.datatextfield=rdr[0];
   dropdown.datavaluefield=rdr[1];
   dropdown.databind();
}
0 голосов
/ 18 июня 2020

Для привязки источника данных вы можете сделать следующее:

    using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True"))
    {
      string com = "SELECT DISTINCT OrgUnitID FROM tblZaposleni_AD ORDER BY OrgUnitID ASC";    
      SqlDataAdapter adpt = new SqlDataAdapter(com, conn); 
      DataTable dt = new DataTable();    
      adpt.Fill(dt);    
      ddlOrgUnit.DataSource = dt;    
      ddlOrgUnit.DataBind();    
      ddlOrgUnit.DataTextField = "text field you want to bind";    
      ddlOrgUnit.DataValueField = "value field you want to bind";    
      ddlOrgUnit.DataBind();

      //add default value - you can then remove the default value from html
      ddlOrgUnit.Items.Insert(0, new ListItem("-- Izaberi Org Jedinicu --","N/A")
     }

Вышеупомянутый logi c также должен быть выполнен в методе FillStatus ().

В вашем методе Page_Load выполните следующее

        if (!IsPostBack)
        {
           FillStatus();

           FillOrgUnit();
        }

В ddlOrgUnit_SelectedIndexChanged - например - вы будете обрабатывать значение, выбранное пользователем соответствующим образом - и фильтровать для выбранного значения - или вернуть все.

ПРИМЕЧАНИЕ Когда вы заполняете DataTable (dt) из вашего запроса - у вас будет структура таблицы из следующей SQL table tblZaposleni_AD

Здесь ddlOrgUnit.DataTextField = "text field you want to bind"; вы добавите имя столбца, которое вы хотите связать как текстовый файл - например, Имя

ПРИМЕЧАНИЕ Как использовать tryparse в C#

    if (Int32.TryParse(ddlStatus.SelectedValue, out int theValue))
    {
        //is not null
        sda.SelectCommand.Parameters.Add("@OrgJed", SqlDbType.Int).Value = theValue
    }

    // is null and you dont pass the parameter 

Затем в в вашей хранимой процедуре вы устанавливаете значение по умолчанию для @OrgJed int равным null

ALTER PROCEDURE [dbo].[TestReport]
(           
    @Status bit,
    @OrgJed int = NULL
) 
...