Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从dropdownlist事件访问事件处理程序中的asp.net webcalendar_C#_Asp.net - Fatal编程技术网

C# 从dropdownlist事件访问事件处理程序中的asp.net webcalendar

C# 从dropdownlist事件访问事件处理程序中的asp.net webcalendar,c#,asp.net,C#,Asp.net,我有一天的时间去看网络视频。我希望每次从dropdownlist中选择名称时都触发相同的事件,并且DayRenderEvent中唯一需要更改的是数据库查询中的字符串(所选名称) 我该怎么做?每次选择姓名时,我都希望日历显示所选人员的数据库条目 我需要为下拉列表事件重新编写整个代码吗?如果是,我如何访问webcalendar 或者我可以调用DayRenderEvent并将所选名称作为参数传递吗 我的DayRenderEvent方法如下所示: protected void Calendar1_Day

我有一天的时间去看网络视频。我希望每次从dropdownlist中选择名称时都触发相同的事件,并且DayRenderEvent中唯一需要更改的是数据库查询中的字符串(所选名称)

我该怎么做?每次选择姓名时,我都希望日历显示所选人员的数据库条目

我需要为下拉列表事件重新编写整个代码吗?如果是,我如何访问webcalendar

或者我可以调用DayRenderEvent并将所选名称作为参数传递吗

我的DayRenderEvent方法如下所示:

protected void Calendar1_DayRenderEventHandler(object sender, DayRenderEventArgs e)
        {
            try
            {

               //Database stuff

                if (maxCode != null && maxCode2 != null)
                {
                    da = new SqlDataAdapter(cmd);

                    ds = new DataSet();
                    da.FillSchema(ds, SchemaType.Source);
                    da.Fill(ds);

                    list1 = new DropDownList();
                    list1.DataSource = ds;
                    list1.DataTextField = "A_TYPE";
                    list1.DataValueField = "A_TYPE";
                    list1.DataBind();

                    da2 = new SqlDataAdapter(cmd2);
                    ds2 = new DataSet();
                    da2.FillSchema(ds2, SchemaType.Source);
                    da2.Fill(ds2);

                    list2 = new DropDownList();
                    list2.DataSource = ds2;
                    list2.DataTextField = "A_Type";
                    list2.DataValueField = "A_Type";
                    list2.DataBind();

                    DayOfWeek comptag = e.Day.Date.DayOfWeek;
                    for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
                    {
                        string thisday = e.Day.Date.ToString();
                        string dayfromdb = ds2.Tables[0].Rows[i]["Date"].ToString();
                        list.Add(dayfromdb);

                        if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && dayfromdb == thisday)
                        {
                            e.Cell.Controls.Add(list2);
                        }
                        else if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && list.Contains(thisday) == false)
                        {
                            e.Cell.Controls.Add(list1);
                        }
                    } // for
                }
                else
                {
                    e.Cell.Text = "MaxCode or MaxCode2 == null";
                }
            }
            catch (Exception exptn)
            {
                string exp = exptn.StackTrace;
            }
            finally
            {
                con.Close();
            }
        } // DayRenderEventHandler
数据集方法

 private DataSet createDataSet(SqlCommand cmd)
        {
            da = new SqlDataAdapter(cmd);
            ds = new DataSet();
            da.FillSchema(ds, SchemaType.Source);
            da.Fill(ds);
            return ds;
        }
迭代日历日的方法

private void CalendarIterate(DataSet ds2, DayOfWeek comptag, DayRenderEventArgs e)
        {
            for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
            {
                string thisday = e.Day.Date.ToString();
                string dayfromdb = ds2.Tables[0].Rows[i]["Date"].ToString();
                liste.Add(dayfromdb);

                if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && dayfromdb == thisday)
                {
                    e.Cell.Controls.Add(list2);
                }
                else if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && liste.Contains(thisday) == false)
                {
                    e.Cell.Controls.Add(list1);
                }
            }
        }

这看起来像是一个典型的重构案例(并且遵循了这个原则)。我建议的最简单的事情是识别将在两个事件之间共享的公共代码,并使用VisualStudio中的重构-提取方法功能提取这些代码

你正在打破的另一个关键原则是“S”。看看你的方法所承担的责任。它执行数据库查询,迭代结果,然后操纵日历控件。这确实需要分解成不同的方法。这将使测试和bug修复变得更加容易(并且可以防止代码重复)。虽然有文档记录了应用于类的方法,但我也尽力将其应用于我的方法


我知道我可能没有提供您希望的答案(即完整的代码示例),但如果您将其分解并保持干燥,您将得到更干净的代码。

是的,我知道,代码远不是很好(我只是太不懂编程)。我肯定会在某个时候优化代码,但现在我只是在寻找一个可行的解决方案。一旦我有了这些,我将考虑改进代码。Thanx虽然有链接!但同样:假设我将迭代放入另一个方法中:那么我必须将DayOfWeek comptag作为参数传递,将DataSet作为参数传递,将DayRenderEvent作为参数传递。然后我只能对DayRenderEvent使用该迭代方法。。。然后我遇到了同样的问题,我无法从SelectedIndexChanged事件方法中访问它…我认为您可能需要更多地考虑一下您的设计,DayRender事件在日历中每天调用一次,因此您最终会调用那么多数据库。这不好。您需要尽量减少数据库调用,最好只调用一次。我建议您重构此方法中的DB调用,将结果存储在某个位置,然后在此方法中使用这些结果。一个选项(可能有效,也可能无效)是将下拉列表的autopostback属性设置为true,当页面重新加载时,日历将执行您的逻辑重新呈现。我已经将autopostback设置为true,当我按下按钮时会有连接。我只是在努力学习如何渲染日历。我现在的问题是,我不知道如何从DayRenderEvent之外访问日历的单元格。比如说,我想在SelectedIndexChanged方法启动后,动态地向日历添加一个dropdownlist。这一定是可能的,不是吗?我不认为你可以访问DayRender事件之外的单元格,但这不重要。当下拉列表的SelectedIndexChanged触发时,将调用DayRender事件(作为回发的一部分)。e、 如果选择了下拉列表中的第二项,则添加if(DropDownList1.SelectedIndex==1){e.Cell.Controls.Add(new DropDownList());}将每天添加一个新的下拉列表控件。我不确定这是否有用?
private void CalendarIterate(DataSet ds2, DayOfWeek comptag, DayRenderEventArgs e)
        {
            for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
            {
                string thisday = e.Day.Date.ToString();
                string dayfromdb = ds2.Tables[0].Rows[i]["Date"].ToString();
                liste.Add(dayfromdb);

                if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && dayfromdb == thisday)
                {
                    e.Cell.Controls.Add(list2);
                }
                else if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && liste.Contains(thisday) == false)
                {
                    e.Cell.Controls.Add(list1);
                }
            }
        }
protected void Calendar1_DayRenderEventHandler(object sender, DayRenderEventArgs e)
        {
            try
            {
                con = DBConnect();
                cmd = new SqlCommand("", con);
                cmd2 = new SqlCommand("", con);
                maxCode = cmd.ExecuteScalar();
                maxCode2 = cmd2.ExecuteScalar();

                if (maxCode != null && maxCode2 != null)
                {
                    list1 = new DropDownList();
                    list1.DataSource = createDataSet(cmd);
                    list1.DataTextField = "A_TYP";
                    list1.DataValueField = "A_TYP";
                    list1.DataBind();

                    list2= new DropDownList();
                    list2.DataSource = createDataSet(cmd2);
                    list2.DataTextField = "A_Typ";
                    list2.DataValueField = "A_Typ";
                    list2.DataBind();

                    DayOfWeek comptag = e.Day.Date.DayOfWeek;
                    CalendarIterate(createDataSet(cmd2), comptag, e);
                }
                else
                {
                    e.Cell.Text = "MaxCode or MaxCode2 == null";
                }
            }
            catch (Exception exptn)
            {
                string exp = exptn.StackTrace;
            }
            finally
            {
                con.Close();
            }
        }